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/130776.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java反射机制及其使用

    Java反射机制及其使用文章目录1Java反射机制概述2反射及其使用2.1关于类java.lang.Class2.2类的加载2.2.1类的加载过程2.2.2类加载器2.3反射的使用2.3.1创建运行时类的对象2.3.2获取运行时类的属性结构2.3.3获取运行时类的方法结构2.3.4获取运行时类的构造器结构2.3.5获取运行时类的父类信息2.3.6获取运行时类实现的接口2.3.7获取运行时类声明的注解2.3.7获取运行时类所在的包2.3.8调用类的构造函数、操作类的属性、调用类中方法1Java

    2022年7月8日
    14
  • densenet详解_dense参数

    densenet详解_dense参数DenseNet于论文《》中提出,是CVPR2017的oral。论文提出DenseNet并与ResNet和Inception做对较。为提升网络的效果,一般操作是增加网络的深度和宽度,但论文作者另辟蹊径,聚焦于feature的极致利用以获得更佳效果和更少参数。对于梯度消失问题,ResNet等网络使用跳层连接结构加以解决。作者延续该思路,提出DenseBlock,在保证网络层间最大程度的信息传输的同时,直接将所有层连接起来。……………………

    2022年9月29日
    0
  • cvpr目标检测_目标检测指标

    cvpr目标检测_目标检测指标论文年份:2016,论文被引:12032(2022/05/03)

    2022年10月30日
    0
  • SAXreader「建议收藏」

    SAXreader「建议收藏」packagecom.joyveb.addon.hp;importjava.io.StringReader;importorg.dom4j.Document;importorg.dom4j.DocumentException;importorg.dom4j.Element;importorg.dom4j.io.SAXReader;publicclassSni…

    2022年6月29日
    25
  • 图的基本算法(BFS和DFS)(转载)

    图的基本算法(BFS和DFS)(转载)

    2022年3月2日
    39
  • 专业函数绘图软件Origin

    专业函数绘图软件Origin首先:Origin软件已经是科研院所等单位的必备工作软件之一,之所以大家讨论得较少,有可能并不是其上手难度低,而是这些使用人群的学习理解能力要相对高一点吧;其次:Excel不垃圾,但在函数绘图方面,比起Origin差远了,用垃圾来形容并不过分,可以问问任何高校老师,他们还会使用Excel出图么?那简直是自己找死。当然Origin也只是在绘图方面比Excel厉害,其它的方面还是比Excel差

    2022年5月31日
    55

发表回复

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

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