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

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


相关推荐

  • springboot的启动流程及原理_精馏的原理及流程

    springboot的启动流程及原理_精馏的原理及流程1.springboot的启动类入口@SpringBootApplication@ComponentScan(basePackages={“cn”})publicclassSpringBootDemo{publicstaticvoidmain(String[]args){SpringApplication.run(SpringBootDemo.class);}}可以看出,Annotation定义(@SpringBootApplicati

    2022年8月21日
    3
  • Android面试题之Activity篇

    Android面试题之Activity篇Activity篇目录前言一、Activity1、什么是Activity?2、请描述一下Activity生命周期3、请描述一下Activity的四个状态4、两个Activity之间传递数据,除了intent,广播接收者,contentprovider还有啥?5、Android中的Context,Activity,Appliction有什么区别?6、Context是什么?7、如何保存Activity的状态?8、横竖屏切换时Activity的生命周期9、两个Activity

    2022年5月21日
    36
  • Visdom使用

    Visdom使用这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导出与导入导出导入欢迎使用Ma…

    2022年6月29日
    36
  • matlab 计算变异系数,变异系数法求权重matlab代码

    matlab 计算变异系数,变异系数法求权重matlab代码《变异系数法求权重matlab代码》由会员分享,可在线阅读,更多相关《变异系数法求权重matlab代码(1页珍藏版)》请在读根文库上搜索。1、变异系数法求权重matlab代码clear;clc;data1,header1=xlsread(statistic1.xlsx,ECO);%必须将statistic.xlsx至于默认文件下,或者给出完整路径data2,header2=xl…

    2022年4月28日
    114
  • java json转list_json转javabean

    java json转list

    _json转javabeanpublicstaticvoidmain(String[]args)throwsIllegalAccessException,InvocationTargetException{ Stringstr=”[{\”repaymentTime\”:\”2019-05-1510:40:00\”,\”repaymentMoney\”:\”840\”,\”consumpti…

    2022年9月8日
    0
  • 初识行为识别

    初识行为识别随着互联网的不断发展,各种应用的不断推广。数据无论从存储,格式,形式,类型等方面都趋向于多样化,丰富化,指数化。数据就是价值,为何这么说呢?在机器学习,深度学习推动下,训练数据需求很大。对于分类模型,训练数据越多,分类器的准确度会在一定程度上更精确。行为识别可以说就是在这基础上演变出来的一个研究分支。那么什么是行为识别呢?我的理解是这样的,比如对于某个图片或者视频中的某个信息进行捕获,我们可以使用…

    2022年6月21日
    23

发表回复

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

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