HDU1325||HDU1272(小希的迷宫)

整了以造成终于把HDU 上小希的迷宫交对了,但是交1325却怎么也不对,好郁闷啊。。。判断的那块太头疼了。最后有参考了网上一个代码 把自己的优化了一下。


       #include "iostream" #include "stdio.h" using namespace std; #define N 100002 int set[N],rank[N],mark[N]; int make_set() { int i; for(i=0; i<N; i++) { set[i]=i; rank[i]=0; mark[i]=false; } } int find_set(int x) { if(x!=set[x]) set[x]=find_set(set[x]); return set[x]; } bool Union(int x, int y) { x=find_set(x); y=find_set(y); if(x==y) return false; if(rank[x]>rank[y]) set[y]=x; else { if(rank[x]==rank[y]) rank[y]++; set[x]=y; } return true; } bool Judge() { int i,tr=0; for(i=0; i<N; i++) { if(mark[i]) { if(i==set[i]) tr++; } } if(tr>1) return false; return true; } int main() { int i,j,m,n,e,a,b,conut=1; while(scanf("%d%d",&a,&b)) { if(a==-1&&b==-1) break; if(a==0 && b==0) { printf("Case %d is a tree./n",conut++); continue; } else { make_set(); mark[a]=mark[b]=1; Union(a,b); bool f=1; while(scanf("%d%d",&a,&b)) { if(a==0 && b==0) break; if(a!=b) f*=Union(a,b); else Union(a,b); mark[a]=mark[b]=1; } if(f && Judge()) printf("Case %d is a tree./n",conut++); else printf("Case %d is not a tree./n",conut++); } } system("pause"); return 0; } /* 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 */  
   

你可能感兴趣的:(优化,System,iostream)