HDU1325
并查集边维护边判定加入的两点的祖先是不是一样,一样的话就不行(因为有环)。
维护一下每个点入度,找到根以后dfs一下看看能不能跑全整个图。
1 #include<iostream> 2 #include<unordered_map> 3 #include<vector> 4 #include<string.h> 5 using namespace std; 6 int f[100100],in[100100],book[100100]; 7 int ff=1,cnt=0,u,v,q; 8 unordered_map<int,int> mp; 9 vector<int> a; 10 vector<int> g[100100]; 11 12 void ini(){ 13 for (int i=1;i<100100;i++) f[i]=i,g[i].clear(); 14 mp.clear(); 15 a.clear(); 16 memset(in,0,sizeof in); 17 memset(book,0,sizeof book); 18 ff=1 19 q++; 20 } 21 22 int getf(int u){ 23 return u==f[u]?f[u]:f[u]=getf(f[u]); 24 } 25 26 void merge(int u,int v){ 27 f[getf(u)]=getf(v); 28 } 29 30 void dfs(int now){ 31 if (book[now]) return; 32 book[now]=1; 33 cnt++; 34 for (int nx:g[now]) dfs(nx); 35 } 36 37 int main() 38 { 39 ini(); 40 while (cin>>u>>v) { 41 if (u==-1 && v==-1) break; 42 if (u==0 && v==0) { 43 for (int nx:a) if (getf(nx)!=getf(a[0])) ff=0; 44 cnt=0; 45 for (int tmp:a) if (!in[tmp]) dfs(tmp); 46 if (cnt!=a.size()) ff=0; 47 if (ff) cout<<"Case "<<q<<" is a tree."<<endl; 48 else cout<<"Case "<<q<<" is not a tree."<<endl; 49 ini(); 50 continue; 51 } 52 if (!mp[u]) a.push_back(u); 53 if (!mp[v]) a.push_back(v); 54 mp[u]=mp[v]=1; 55 if (++in[v]>1) ff=0; 56 if (getf(u)==getf(v)) ff=0; 57 merge(u,v); 58 g[u].push_back(v); 59 } 60 return 0; 61 }

浙公网安备 33010602011771号