Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:怎麼我的并查集這組數據輸出不是樹 附代碼In Reply To:Re:同志们:利用并查集是错的,我用并查集也AC了,但是仔细研究后,发现是错了,数据太弱了 Posted by:tangcong506 at 2011-10-30 18:25:00 #include<iostream> #include<map> #include<cstring> using namespace std; int key[10001] , indegree[10001] , t; int fun(int a) { if(key[a]==a) return a; key[a] = fun(key[a]); return key[a]; } int main() { int casenum = 0 , a , b , p1 , p2 , i , c , d , f , root; map<int,int> v; bool flag , end = false; while(1) { casenum++; flag = true; v.clear(); t = root = 0; memset(indegree,0,sizeof(indegree)); while(cin>>a>>b) { if(a==0) break; if(a==-1) { end = true; break; } if(v.count(a)==0) { t++; v.insert(make_pair(a,t)); p1 = t; key[p1] = p1; } else p1 = v[a]; if(v.count(b)==0) { t++; v.insert(make_pair(b,t)); p2 = t; key[p2] = p2; } else p2 = v[b]; indegree[p2]++; c = fun(p1); d = fun(p2); if(c!=d) key[c] = d; } if(end) break; f = fun(1); for(i = 1 ; i <= t ; i++) if(fun(i)!=f) flag = false; for(i = 1 ; i <= t ; i++) { if(indegree[i]>1) flag = false; if(indegree[i]==0) root++; } if(root!=1) flag = false; if(t==0) flag = true; if(flag) cout << "Case " << casenum << " is a tree." << endl; else cout << "Case " << casenum << " is not a tree." << endl; } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator