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 } 

 

posted @ 2020-04-28 17:16  White_Li  阅读(86)  评论(0)    收藏  举报