HDU1272
Posted 上进小青年
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }
对于输入输出数据多的代码,要用scanf和printf,此题用cin和cout就会超时。
以上是关于HDU1272的主要内容,如果未能解决你的问题,请参考以下文章