HDU1272

http://acm.split.hdu.edu.cn/showproblem.php?pid=1272

对于这道题,只要找出形成的图是不是连通无环的图即可。即是判断输入的两个点是否来自同一个父亲结点。还要注意不要忘记这个图一定是互相连通的。另外注意当输入两个0的时候也是输出Yes

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<string.h>
 5 using namespace std;
 6 const int M=100015;
 7 int fa[M],vis[M];
 8 int fin(int x)
 9 {
10     return fa[x]==x?fa[x]:fa[x]=fin(fa[x]);
11 }
12 int unin(int x,int y){
13 return fa[fin(x)]=fin(y);
14 }
15 int main()
16 {
17     int a,b;
18     while(~scanf("%d%d",&a,&b)){
19         if(a==-1&&b==-1)break;
20         if(a==0&&b==0){
21           puts("Yes");
22             continue;
23         }
24         int flag=1;
25         for(int i=0;i<M;i++){
26             fa[i]=i;
27         }
28         memset(vis,0,sizeof(vis));
29         unin(a,b);
30         vis[a]=vis[b]=1;
31         while(~scanf("%d%d",&a,&b)){
32             if(a==0&&b==0)break;
33             if(fin(a)==fin(b))flag=0;
34             else unin(a,b);
35             vis[a]=vis[b]=1;
36         }
37         if(!flag)puts("No");
38         else {for(int i=0;i<M;i++)
39             if(vis[i]&&fa[i]==i)
40                 flag++;
41          if(flag==2)puts("Yes");
42         else puts("No");
43 
44         }
45     }
46 return 0;
47 }
View Code

对于输入输出数据多的代码,要用scanf和printf,此题用cin和cout就会超时。

你若盛开,清风自来...
原文地址:https://www.cnblogs.com/shangjindexiaoqingnian/p/5824878.html