Advertisement
Guest User

clo

a guest
Mar 21st, 2018
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.93 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <bitset>
  4. using namespace std;
  5. int n,m,a,b,wynik[100001],par[100001];
  6. pair <int,int> cykl;
  7. bitset <100001> odw;
  8. vector <int> v[100001];
  9. vector <int> v1[100001];
  10. vector <int> w;
  11. vector <pair<int,int> > t;
  12. void szukaj(int x,int y)
  13. {
  14. w.push_back(x);
  15.  
  16.     odw[x]=1;
  17.     for(int j=0;v[x].size()>j;j++)
  18.     {
  19.         if(odw[v[x][j]]==1 and v[x][j]!=y and cykl.first==0)
  20.         {
  21.             cykl.first=v[x][j];
  22.             cykl.second=x;
  23.  
  24.         }
  25.         if(odw[v[x][j]]==0)
  26.             szukaj(v[x][j],x);
  27.     }
  28. }
  29. void bfs(int x,int y)
  30. {
  31.  
  32.     for(int i=0;v1[x].size()>i;i++)
  33.     {
  34.         if(v1[x][i]!=y)
  35.         {
  36.             wynik[v1[x][i]]=x;
  37.             bfs(v1[x][i],x);
  38.  
  39.         }
  40.     }
  41. }
  42. int Find(int x)
  43. {
  44.     if(par[x]==x)
  45.     return x;
  46.    par[x]=Find(par[x]);
  47.     return par[x];
  48. }
  49. void Union(int h,int j)
  50. {
  51.     par[Find(h)]=Find(j);
  52. }
  53. int main()
  54. {
  55. cin>>n>>m;
  56. for(int i=1;m>=i;i++)
  57.     par[i]=i;
  58. for(int i=0;m>i;i++)
  59. {
  60.     cin>>a>>b;
  61.     v[a].push_back(b);
  62.     v[b].push_back(a);
  63.     t.push_back({a,b});
  64. }
  65.  
  66. for(int i=1;n>=i;i++)
  67. {
  68.     if(odw[i]==0)
  69.     {
  70.  
  71.         cykl.first=0;
  72.         cykl.second=0;
  73.         w.clear();
  74.  
  75.         szukaj(i,-1);
  76.  
  77.         if(cykl.first==0)
  78.         {
  79.             cout<<"NIE";
  80.             return 0;
  81.         }
  82.  
  83.        wynik[cykl.first]=cykl.second;
  84.  
  85.        for(int b=0;w.size()>b;b++)
  86.        {
  87. for(int g=0;v[w[b]].size()>g;g++)
  88. {
  89.  
  90.            if(v[w[b]][g]>w[b] and Find(v[w[b]][g])!=Find(w[b]) and !(w[b]==cykl.first and v[w[b]][g]==cykl.second) and !(w[b]==cykl.second and v[w[b]][g]==cykl.first))
  91.            {
  92.  
  93.                v1[w[b]].push_back(v[w[b]][g]);
  94.                v1[v[w[b]][g]].push_back(w[b]);
  95.                Union(w[b],v[w[b]][g]);
  96.            }
  97.        }
  98.        }
  99.  
  100.        bfs(cykl.first,-1);
  101.     }
  102. }
  103. cout<<"TAK\n";
  104. for(int i=1;n>=i;i++)
  105.     cout<<wynik[i]<<endl;
  106.     return 0;
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement