环环环!!!!!!!!

问题描述
  小明的实验室有N台电脑,编号1~N。原本这N台电脑之间有N-1条数据链接相连,恰好构成一个树形网络。在树形网络上,任意两台电脑之间有唯一的路径相连。


  不过在最近一次维护网络时,管理员误操作使得某两台电脑之间增加了一条数据链接,于是网络中出现了环路。环路上的电脑由于两两之间不再是只有一条路径,使得这些电脑上的数据传输出现了BUG。


  为了恢复正常传输。小明需要找到所有在环路上的电脑,你能帮助他吗?
输入格式
  第一行包含一个整数N。
  以下N行每行两个整数a和b,表示a和b之间有一条数据链接相连。


  对于30%的数据,1 <= N <= 1000
  对于100%的数据, 1 <= N <= 100000, 1 <= a, b <= N


  输入保证合法。
输出格式
  按从小到大的顺序输出在环路上的电脑的编号,中间由一个空格分隔。
样例输入
5
1 2
3 1
2 4
2 5
5 3
样例输出
1 2 3 5
并查集+dfs
  1 #include<iostream>
  2 #include<cstdio>
  3 #include<vector>
  4 #include<cstring>
  5  
  6 using namespace std;
  7  
  8 const int N = 100000+5;
  9  
 10 vector<int> V[2*N];
 11 int parent[N], S, E, n;
 12 int vis[N] = {0};
 13  
 14 void init()
 15 {
 16     for(int i=0; i<=N; i++){
 17         parent[i] = i;
 18     }
 19     
 20 }
 21  
 22 int Find(int a)
 23 {
 24     return parent[a] == a? a : (parent[a] = Find(parent[a]));
 25 }
 26  
 27 bool Union(int a, int b)
 28 {
 29 //    cout << a << "    par  " << b << endl;
 30     a = Find(a);
 31     b = Find(b);
 32     
 33     if(a == b){//已构成环 
 34         return true;
 35     }
 36     else {
 37         parent[a] = b;
 38         return false;
 39     }
 40 } 
 41  
 42 void dfs(int u)
 43 {
 44 //        cout << u << E <<endl;
 45         
 46         if(u == E){//到达终点
 47         //    cout<< n << "输出结果为:" ; 
 48             for(int i=1; i<=n; i++){
 49         //        cout << i << ":" << vis[i] << endl;
 50                 if(vis[i]){
 51                     cout << i;
 52                     printf((i == n) ? "\n" : " ");
 53                     //cout << ((i==n) ? endl : " ");
 54                 }
 55             } 
 56             return;
 57         }
 58     //    else cout << u << "!=" << E << endl;
 59         
 60         for(int i=0; i<V[u].size(); i++){
 61             int next = V[u][i];
 62             if(vis[next] == 0){
 63                 vis[next] = 1;
 64                 dfs(next);
 65                 vis[next] = 0;
 66             }
 67         }
 68     return;
 69 }
 70  
 71 int main()
 72 {
 73     cin >> n;
 74     
 75     init();
 76     
 77     for(int i=0; i<n; i++){
 78         int u, v;
 79         
 80         cin >> u >> v;
 81 //            cout << u <<  "  init   " << v << endl;
 82         if(Union(u, v)){//已构成环 
 83         
 84              S = u, E = v;
 85              break;
 86         }
 87         else {
 88             V[u].push_back(v);
 89             V[v].push_back(u);
 90         }
 91     }
 92     
 93 //    cout << "start:" << S << "    end:" << E << endl;
 94     
 95     vis[S] = 1; 
 96     dfs(S);
 97  
 98     return 0;
 99 
100 }

猜你喜欢

转载自www.cnblogs.com/RE-TLE/p/11967557.html