poj 2375「建议收藏」

poj 2375「建议收藏」这道题是一道gu

大家好,又见面了,我是你们的朋友全栈君。

        这道题是一道关于强连通分量的题目,不过这道题给出的图比较特殊,所以在求强连通分量时,可以采用广搜来做。

        这道强连通分量的题,给出的图十分特殊,如果在上下、左右四个方向相邻的区域,如果高度相同,则是相互可达的,所以我们可以通过搜索找出强连通分量,可以降低时间复杂度。

        不过在做这道时,开始想通过一次搜索来完成所有强连通分量的标记,不过有些问题一直无法解决,无奈只好多次广搜,每次找一个强连通分量。找到强连通分量,接下来的做法就和poj 1236(http://blog.csdn.net/u011008379/article/details/37995979)中的第二问做法一样了,这里就不多解释。

        代码(C++):

#include <cstdlib>
#include <iostream>
#include <algorithm>

#define MAX 509
using namespace std;

//#define LOCAL

typedef pair<int,int> pii;

int map[MAX][MAX],dir[][2]={
  
  {0,-1},{1,0},{0,1},{-1,0}},id[MAX][MAX],vis[MAX][MAX],odeg[MAX*MAX],ideg[MAX*MAX];
int p,s,n,m;
pii queue[MAX*MAX];

void bfs(int u,int v,int c)
{
     int a,b,i;
     pii tmp;
     
     p=s=0;
     id[u][v]=c;
     queue[p++]=make_pair(u,v);
     vis[u][v]=true; 
        
     while(s<p)
     {
         tmp=queue[s++];
         for(i=0;i<4;i++)
         {
             a=dir[i][1]+tmp.first;
             b=dir[i][0]+tmp.second;
                                  
             if(a>=0&&a<n&&b>=0&&b<m&&map[a][b]==map[tmp.first][tmp.second])
             {
                   if(vis[a][b]) continue;
                   id[a][b]=c;                               
                   queue[p++]=make_pair(a,b);  
                   vis[a][b]=true;                 
             }            
         }                    
     }
}

int main(int argc, char *argv[])
{
#ifdef LOCAL
   freopen("in.txt","r",stdin);
   freopen("out.txt","w",stdout);
#endif
    int i,j,k,x,y,a,b,c;
    while(scanf("%d %d",&m,&n)!=EOF)
    {
         for(i=0;i<n;i++)
         {
            for(j=0;j<m;j++)
            {
                scanf("%d",&map[i][j]);            
            }             
         }
         
         c=0;                 
         memset(vis,false,sizeof(vis));
         memset(id,-1,sizeof(id));
         for(i=0;i<n;i++)
         {
             for(j=0;j<m;j++)
             {
                 if(!vis[i][j]) bfs(i,j,c++);            
             }            
         }
         if(c==1)
         {
             printf("0\n");    
         }else{
             memset(ideg,0,sizeof(ideg));
             memset(odeg,0,sizeof(odeg));
             for(i=0;i<n;i++)
             {
                 for(j=0;j<m;j++)
                 {
                     for(k=0;k<4;k++)
                     {
                        a=dir[k][1]+i;
                        b=dir[k][0]+j;
                        if(a>=0&&a<n&&b>=0&&b<m)
                        {
                             if(id[i][j]!=id[a][b]) 
                             {
                                 if(map[i][j]>map[a][b])
                                 {
                                     odeg[id[i][j]]++;
                                     ideg[id[a][b]]++;                    
                                 }else{
                                    odeg[id[a][b]]++;
                                    ideg[id[i][j]]++;  
                                 }                   
                             }                    
                        }            
                     }           
                 }             
             }
             x=y=0;
             for(i=0;i<c;i++)
             {
                if(odeg[i]==0) x++;
                if(ideg[i]==0) y++;            
             }
             printf("%d\n",max(x,y));
         }          
    }
    system("PAUSE");
    return EXIT_SUCCESS;
}

题目(
http://poj.org/problem?id=2375):

Cow Ski Area
Time Limit: 1000MS   Memory Limit: 65536K
     

Description

Farmer John’s cousin, Farmer Ron, who lives in the mountains of Colorado, has recently taught his cows to ski. Unfortunately, his cows are somewhat timid and are afraid to ski among crowds of people at the local resorts, so FR has decided to construct his own private ski area behind his farm. 

FR’s ski area is a rectangle of width W and length L of ‘land squares’ (1 <= W <= 500; 1 <= L <= 500). Each land square is an integral height H above sea level (0 <= H <= 9,999). Cows can ski horizontally and vertically between any two adjacent land squares, but never diagonally. Cows can ski from a higher square to a lower square but not the other way and they can ski either direction between two adjacent squares of the same height. 

FR wants to build his ski area so that his cows can travel between any two squares by a combination of skiing (as described above) and ski lifts. A ski lift can be built between any two squares of the ski area, regardless of height. Ski lifts are bidirectional. Ski lifts can cross over each other since they can be built at varying heights above the ground, and multiple ski lifts can begin or end at the same square. Since ski lifts are expensive to build, FR wants to minimize the number of ski lifts he has to build to allow his cows to travel between all squares of his ski area. 

Find the minimum number of ski lifts required to ensure the cows can travel from any square to any other square via a combination of skiing and lifts.

Input

* Line 1: Two space-separated integers: W and L 

* Lines 2..L+1: L lines, each with W space-separated integers corresponding to the height of each square of land.

Output

* Line 1: A single integer equal to the minimal number of ski lifts FR needs to build to ensure that his cows can travel from any square to any other square via a combination of skiing and ski lifts

Sample Input

9 3
1 1 1 2 2 2 1 1 1
1 2 1 2 3 2 1 2 1
1 1 1 2 2 2 1 1 1

Sample Output

3

Hint

This problem has huge input data,use scanf() instead of cin to read data to avoid time limit exceed. 

OUTPUT DETAILS: 

FR builds the three lifts. Using (1, 1) as the lower-left corner, 

the lifts are (3, 1) <-> (8, 2), (7, 3) <-> (5, 2), and (1, 3) <-> 

(2, 2). All locations are now connected. For example, a cow wishing 

to travel from (9, 1) to (2, 2) would ski (9, 1) -> (8, 1) -> (7, 

1) -> (7, 2) -> (7, 3), take the lift from (7, 3) -> (5, 2), ski 

(5, 2) -> (4, 2) -> (3, 2) -> (3, 3) -> (2, 3) -> (1, 3), and then 

take the lift from (1, 3) – > (2, 2). There is no solution using 

fewer than three lifts.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/130774.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月13日 下午1:36
下一篇 2022年6月13日 下午1:46


相关推荐

  • 二极管处于截止状态时电压为多少_放大电路饱和失真

    二极管处于截止状态时电压为多少_放大电路饱和失真1.截止状态所谓截止,就是三极管在工作时,集电极电流始终为0。此时,集电极与发射极间电压接近电源电压。对于NPN型硅三极管来说,当Ube在0~0.5V之间时,Ib很小,无论Ib怎样变化,Ic都为0。此时,三极管的内阻(Rce)很大,三极管截止。当在维修过程中,测得Ube低于0.5V或Uce接近电源电压时,就可知道三极管处在截止状态。当Ube在0.5~0.7V之间时,Ub

    2025年10月18日
    7
  • 四叉树——图片应用实例

    四叉树——图片应用实例四叉树前言应用实例前言四元树又称四叉树是一种树状数据结构 在每一个节点上会有四个子区块 四元树常应用于二维空间数据的分析与分类 它将数据区分成为四个象限 数据范围可以是方形或矩形或其他任意形状 这种数据结构是由拉斐尔 芬科尔 RaphaelFinke 与 J L Bentley 在 1974 年发展出来 应用实例四叉树索引结构可以快速的在二维空间划分数据 下面是一张图片的四

    2026年3月18日
    2
  • 喊山第二部_软组raid0

    喊山第二部_软组raid0原题链接喊山,是人双手围在嘴边成喇叭状,对着远方高山发出“喂—喂喂—喂喂喂……”的呼唤。呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成的“讯号”,达到声讯传递交流的目的。原来它是彝族先民用来求援呼救的“讯号”,慢慢地人们在生活实践中发现了它的实用价值,便把它作为一种交流工具世代传袭使用。(图文摘自:http://news.xrxxw.com/newsshow-8018.html)一个山头呼喊的声音可以被临近的山头同时听到。题目假设每个山头最多有两个能听到它的临近山头。给定任意一个发

    2022年8月9日
    7
  • List转JSONArray和JSONArray转List转

    List转JSONArray和JSONArray转List转@List转JSONArray和JSONArray转List1.List转JSONArrayListlist=newArrayList();JSONArrayarray=JSONArray.parseArray(JSON.toJSONString(list));2.JSONArray转ListJSONArrayarray=newJSONArray();Listli…

    2022年6月16日
    33
  • 退役笔记一#MySQL = lambda sql : sql + &#39; Source Code 4 Explain Plan &#39;

    退役笔记一#MySQL = lambda sql : sql + &#39; Source Code 4 Explain Plan &#39;

    2021年12月1日
    39
  • 什么是单例模式?单例模式有什么作用?为什么要用单例模式

    什么是单例模式?单例模式有什么作用?为什么要用单例模式单例模式单例模式 SingletonPat 是 Java 中最简单的设计模式之一 这种类型的设计模式属于创建型模式 它提供了一种创建对象的最佳方式 这种模式涉及到一个单一的类 该类负责创建自己的对象 同时确保只有单个对象被创建 这个类提供了一种访问其唯一的对象的方式 可以直接访问 不需要实例化该类的对象 注意 1 单例类只能有一个实例 2 单例类必须自己创建自己的唯一

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号