JacobianDet

Untitled

Mar 8th, 2019
268
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.75 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define pb push_back
  3. #define mp std::make_pair
  4.  
  5. std::vector<int> G[200001];
  6. int degx[200001], fin[200001], lt[200001], cct[200001];
  7. bool vis[200001], isB[200001];
  8. std::map<std::pair<int, int>, int> EX;
  9. int tx;
  10.  
  11. void bfs_visit(int n, int m, int dx, int s)
  12. {
  13.     std::queue<int> Q;
  14.     int xd = dx - cct[s];
  15.     vis[s] = 1;
  16.     for(auto u : G[s])
  17.     {
  18.         if(isB[EX[mp(s, u)]])
  19.         {
  20.             std::cout<<s<<" "<<u<<"\n";
  21.             vis[u] = 1;
  22.             Q.push(u);
  23.         }  
  24.         else if(xd > 0)
  25.         {
  26.             std::cout<<s<<" "<<u<<"\n";
  27.             vis[u] = 1;
  28.             Q.push(u);
  29.             xd--;
  30.         }
  31.     }
  32.     while(!Q.empty())
  33.     {
  34.         int u = Q.front();
  35.         Q.pop();   
  36.         for(auto v : G[u])
  37.         {
  38.             if(!vis[v])
  39.             {
  40.                 std::cout<<u<<" "<<v<<"\n";
  41.                 vis[v] = 1;
  42.                 Q.push(v);
  43.             }  
  44.         }
  45.     }
  46.     return;
  47. }
  48.  
  49. void dfs_visit(int s, int p)
  50. {
  51.     vis[s] = 1;
  52.     fin[s] = tx;
  53.     lt[s] = tx;
  54.     tx++;
  55.     for(auto u : G[s])
  56.     {
  57.         if(u == p)
  58.         continue;
  59.         if(vis[u])
  60.         lt[s] = std::min(lt[s], fin[u]);
  61.         else
  62.         {
  63.             dfs_visit(u, s);
  64.             lt[s] = std::min(lt[s], lt[u]);
  65.             if(lt[u] >= fin[s])
  66.             {  
  67.                 isB[EX[mp(s, u)]] = 1; 
  68.                 cct[s]++;
  69.                 cct[u]++;
  70.             }  
  71.         }  
  72.     }
  73.     return;
  74. }
  75.  
  76. int main(void)
  77. {
  78.     std::ios_base::sync_with_stdio(false);
  79.     std::cin.tie(NULL);
  80.     std::cout.tie(NULL);
  81.     tx = 0;
  82.     int n,m,dx;
  83.     std::cin>>n>>m>>dx;
  84.     int zx = 0;
  85.     for(int i=0;i<m;i++)
  86.     {
  87.         int s,d;
  88.         std::cin>>s>>d;
  89.         G[s].pb(d);
  90.         G[d].pb(s);
  91.         EX[mp(s, d)] = zx;
  92.         EX[mp(d, s)] = zx;
  93.         zx++;
  94.         degx[s]++;
  95.         degx[d]++;
  96.     }  
  97.     dfs_visit(1, -1);  
  98.     memset(vis, 0, sizeof(vis));
  99.     int nd = -1;
  100.     for(int i=1;i<=n;i++)
  101.     {
  102.         if(degx[i] >= dx && cct[i] <= dx)
  103.         {
  104.             nd = i;
  105.             break;
  106.         }  
  107.     }  
  108.     if(nd == -1)
  109.     std::cout<<"NO\n";
  110.     else
  111.     {
  112.         std::cout<<"YES\n";
  113.         bfs_visit(n, m, dx, nd);
  114.     }  
  115.     return 0;
  116. }
Add Comment
Please, Sign In to add comment