杭电1272

编程入门 行业动态 更新时间:2024-10-25 10:25:59

<a href=https://www.elefans.com/category/jswz/34/1767466.html style=杭电1272"/>

杭电1272

上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走。但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了房间A和B,那么既可以通过它从房间A走到房间B,也可以通过它从房间B走到房间A,为了提高难度,小希希望任意两个房间有且仅有一条路径可以相通(除非走了回头路)。小希现在把她的设计图给你,让你帮忙判断她的设计图是否符合她的设计思路。比如下面的例子,前两个是符合条件的,但是最后一个却有两种方法从5到达8。


Input 输入包含多组数据,每组数据是一个以0 0结尾的整数对列表,表示了一条通道连接的两个房间的编号。房间的编号至少为1,且不超过100000。每两组数据之间有一个空行。
整个文件以两个-1结尾。

Output 对于输入的每一组数据,输出仅包括一行。如果该迷宫符合小希的思路,那么输出"Yes",否则输出"No"。

Sample Input 6 8 5 3 5 2 6 4 5 6 0 0 8 1 7 3 6 2 8 9 7 5 7 4 7 8 7 6 0 0 3 8 6 8 6 4 5 3 5 6 5 2 0 0 -1 -1
Sample Output Yes Yes No

# include<stdio.h>

int set[100001];//记录根节点

 

int find(int x)

{

       if(set[x]!=x)

              set[x]=find(set[x]);

       return set[x];

}

 

void Combain(int pa,int pb)

{

       if(pa>pb)

              set[pa]=pb;

       else

              set[pb]=pa;

}

 

int main()

{

       int i,a,b,pa,pb,flag,max,min;

       bool use[100001];//标记走过的路

       while(scanf("%d%d",&a,&b))

       {

              if(a==0&&b==0)

              {

                     printf("Yes\n");

                     continue;

              }

              if(a==-1&&b==-1)

                     break;

              for(i=1;i<=100001;i++)

              {

                     set[i]=i;

                     use[i]=false;

              }

              max=0;min=100001;

              flag=0;

              for(i=1;a!=0&&b!=0;i++)

              {

                     if(max<a)max=a;

                  if(max<b)max=b;

                  if(min>a)min=a;

                  if(min>b)min=b;

                  pa=find(a);

                 pb=find(b);

                     use[a]=use[b]=true;

                  if(pa==pb)   //非法走到一块,即通过两条不同的路走到了一块,那必定构成了一个连通图

                       flag++; 

                  else

                       Combain(pa,pb);

                     scanf("%d%d",&a,&b);

              }

              for(i=min;i<=max;i++)  //是否存在多个集合

                     if(use[i]&&set[i]==i)

                        flag++;

              if(flag==1)

                     printf("Yes\n");

              else

                     printf("No\n");

       }

       return 0;

}

 

附另一方法:如果不连通,边数始终会比点少一!!

# include<stdio.h>
int main()
{
 int a,b,count,i,min,max,flag;
 bool use[100001];
 while(scanf("%d%d",&a,&b))
 {
  if(a==-1&&b==-1)
   break;
  if(a==0&&b==0)
  {
   printf("Yes\n");
   continue;
  }
  count=0;
  flag=0;
  for(i=1;i<=100001;i++)
   use[i]=false;
  min=100001;max=0;
  for(i=1;a!=0&&b!=0;i++)
  {
   if(min>a)min=a;
   if(min>b)min=b;
   if(max<a)max=a;
   if(max<b)max=b;
   use[a]=use[b]=true;
   scanf("%d%d",&a,&b);
   ++count;
  }
  for(i=min;i<=max;i++)
   if(use[i])
    flag++;
  
  
   if(flag-count==1)
    printf("Yes\n");
   else
    printf("No\n");
 }
 return 0;
}

 

 

 

 

 

更多推荐

杭电1272

本文发布于:2024-03-10 04:18:58,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1726992.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:杭电

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!