(判環-基礎並查集)hdu1272 小希的迷宮
阿新 • • 發佈:2018-12-29
目錄
判斷是否能形成環即可。程式碼wa,還沒找出錯QWQ。-------找出錯誤了。
錯在連通分量只能有一個,如果連通分量大於1,輸出no。
錯誤程式碼:
//錯誤程式碼: #include<iostream> #include<cstdio> using namespace std; const int maxn=100010; int par[maxn]; bool flag; void init(){ flag=true; for(int i=1;i<maxn;i++) par[i]=i; } int fi(int x){ if(par[x]==x) return x; return par[x]=fi(par[x]); } void join(int x,int y){ int fx=fi(x),fy=fi(y); if(fx==fy) flag=false; else par[fy]=fx; } int main(){ int a,b; init(); while(~scanf("%d%d",&a,&b)){ if(a==-1&&b==-1) break; if(a==0&&b==0){ if(flag) printf("Yes\n"); else printf("No\n"); init(); continue; } join(a,b); } return 0; }
正確程式碼:
//正確程式碼: #include<iostream> #include<cstdio> #include<set> using namespace std; const int maxn=100010; int par[maxn]; bool flag; void init(){ flag=true; for(int i=1;i<maxn;i++) par[i]=i; } int fi(int x){ if(par[x]==x) return x; return par[x]=fi(par[x]); } /* int fi(int x){ int r=x; while(par[r]!=r) r=par[r]; int tmp,j=x; while(par[j]!=r){ tmp=j; par[j]=r; j=par[tmp]; } return r; } */ void join(int x,int y){ int fx=fi(x),fy=fi(y); if(fx==fy) flag=false; else par[fy]=fx; } int main(){ int a,b; init(); set<int> s; while(~scanf("%d%d",&a,&b)){ if(a==-1&&b==-1) break; if(a==0&&b==0){ if(flag){ int cnt=0; set<int>::iterator it; for(it=s.begin();it!=s.end();it++){ if(par[*it]==*it){ cnt++; if(cnt>1){ flag=false; break; } } } } s.clear(); if(flag) printf("Yes\n"); else printf("No\n"); init(); continue; } s.insert(a); s.insert(b); join(a,b); } return 0; }