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
Yes Yes No
【題意】
給你一個圖的描述,要求圖聯通,且圖不成環;
用並查集可以簡單的解決。 注意邊界條件,輸入一條邊 例如 1 1 0 0 或者一條邊也不輸入 0 0 ,也要輸出Yes。
【代碼】
#include#include #include #include using namespace std; const int maxp=100005; struct Parent{ int value,rank; }parent[maxp]; void MakeSet(){ //初始化 for(int i=1;i parent[yroot].rank) // 按秩合並 parent[yroot].value=xroot; else if(parent[xroot].rank st; MakeSet(); int sign=0;int cnt=0; //代碼寫的冗雜,出現很多細節問題要處理 while(scanf(%d%d,&a,&b)!=EOF){ if(a==-1&&b==-1) break; if(a==0&&b==0){ if(cnt==1||cnt==0){ printf(Yes ); cnt=0;st.clear();MakeSet();sign=0; continue; } if(sign){ printf(No );cnt=0;st.clear();MakeSet();sign=0;;continue; } int ans=0; for(set ::iterator it=st.begin();it!=st.end();++it){ //用set來儲存輸入的數據 if(parent[*it].value==*it){ ans++; } } cnt=0;st.clear();MakeSet();sign=0; if(ans==1){ printf(Yes ); } else printf(No ); } else{ int tmp=Union(a,b); st.insert(a); st.insert(b); if(!tmp){ sign=1; } cnt++; } } return 0; }