标签:HERE art NPU efi poj call rmi .com des
Input
Output
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
Case 1 is a tree. Case 2 is a tree. Case 3 is not a tree.
做法:
并查集判断有没有环
然后判断有没有森林
有没有入度大于1的点即可
小心自己指向自己的点
小心 只有一个 0 0
代码:
1 #include<iostream> 2 using namespace std; 3 #include<cstring> 4 #include<cstdio> 5 const int maxn = 110000; 6 struct DSU{ 7 int f[maxn]; 8 int v[maxn]; 9 void init(){ 10 for(int i=0;i<maxn;i++) 11 f[i] = i,v[i] = 0; 12 } 13 int getfa(int x){ 14 return f[x]==x?x:f[x] = getfa(f[x]); 15 } 16 int connect(int x,int y){ 17 v[x] = v[y] = 1; 18 int fx,fy; 19 fx = getfa(x); 20 fy = getfa(y); 21 if(fx==fy) 22 return 0; 23 f[fx] = fy; 24 getfa(x); 25 return 1; 26 } 27 int getnum(){ 28 int ans = 0; 29 for(int i=0;i<maxn;i++){ 30 if(v[i]&&f[i]==i) 31 ans+=1; 32 } 33 return ans==1; 34 } 35 }; 36 int rd[maxn]; 37 DSU pt; 38 int main(){ 39 int x,y,num = 0; 40 while(scanf("%d%d",&x,&y)!=EOF&&x>=0&&y>=0){ 41 pt.init(); 42 memset(rd,0,sizeof(rd)); 43 pt.connect(x,y); 44 rd[y]+=1; 45 int ok = 1; 46 if(x==y&&(x!=0||y!=0)) 47 ok = 0; 48 if(x!=0&&y!=0) 49 while(scanf("%d%d",&x,&y)!=EOF&&x!=0&&y!=0){ 50 if(!ok) 51 continue; 52 if(x==y) 53 ok = 0; 54 rd[y]+=1; 55 if(ok==1) 56 ok = rd[y]==1; 57 if(ok==1) 58 ok = pt.connect(x,y); 59 } 60 if(ok==1) 61 ok = pt.getnum(); 62 if(ok) 63 printf("Case %d is a tree.\n",++num); 64 else 65 printf("Case %d is not a tree.\n",++num); 66 } 67 return 0; 68 }
标签:HERE art NPU efi poj call rmi .com des
原文地址:https://www.cnblogs.com/xfww/p/8819514.html