Advertisement
SuitNdtie

SuperNova

Jun 1st, 2019
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.59 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<vector>
  3. using namespace std;
  4. int n,m;
  5. typedef long long int ll;
  6. int const N = 100010;
  7. vector<int> adj[N];
  8.  
  9. int color[N];
  10.  
  11. int deg[N];
  12. bool cycle[N];
  13. bool nearstart[N];
  14.  
  15. int dfscycle(int u,int prev){
  16.     if(color[u] != 0){
  17.     //  printf("found %d\n",u);
  18.         return u;  
  19.     }
  20.     color[u] = prev;
  21.     int ans = -1;
  22.     for(int i = 0 ; i < adj[u].size() ; i ++){
  23.         int v = adj[u][i];
  24.         if(v != prev){
  25.             int val = dfscycle(v,u);
  26.             if(val != -1)ans = val;
  27.         }
  28.     }
  29.     return ans;
  30. }
  31.  
  32. ll val[N];
  33. int visited[N];
  34. ll dfs(int u){
  35. //  if(cycle[u])return 0;
  36. //  if(visited[u])return 0;
  37.    
  38.     visited[u] = true;
  39. //  printf("Test count subtree : %d -> ",u);
  40.     for(int i = 0 ; i < adj[u].size() ; i ++){
  41.         int v = adj[u][i];
  42.         if(!cycle[v] && !visited[v]){
  43. //          printf("%d ",v);
  44.             val[u] += dfs(v);
  45.         }
  46.     }
  47. //  printf("\n");
  48.     return val[u] = val[u] + 1;
  49. }
  50.  
  51. int main()
  52. {
  53.     scanf("%d %d",&n,&m);
  54.     pair<int,int> edge[m+1];
  55.     int startdfs = -1;
  56.     for(int i = 0 ; i < m ; i ++){
  57.         int u,v;
  58.         scanf("%d %d",&u,&v);
  59.         adj[u].push_back(v);
  60.         adj[v].push_back(u);
  61.         edge[i] = {u,v};
  62.         deg[u]++;
  63.         deg[v]++;
  64.     }
  65.    
  66.     for(int i = 1 ; i <= n ; i ++){
  67.         if(deg[i] == 1){
  68.             startdfs = i;
  69.         }
  70.     }
  71.     if(startdfs == -1){ //no leaf
  72.         for(int i = 0 ; i < m ; i++)printf("0 ");
  73.         return 0;  
  74.     }
  75. //  printf("Test start dfs %d\n",startdfs);
  76.     int start = dfscycle(startdfs,-1);
  77.     //start = dfscycle(start,-1);
  78. /*  printf("Test start %d\nParent : ",start);
  79.     for(int i = 1 ; i <= n ; i ++){
  80.         printf("%d ",color[i]);
  81.     }printf("\n");
  82. *///    printf("Test nearstart : ");
  83.     for(int i = 0 ; i < adj[start].size() ; i ++){
  84.         int ne = adj[start][i];
  85.         nearstart[ne] = true;
  86.     //  printf("%d ",ne);
  87.     }//printf("\n");
  88. //  printf("Start cycle : %d\n",start);
  89.     cycle[start] = true;
  90.     int si = color[start];
  91. //  printf("Test si %d\n",si);
  92.     int cnt = 0;
  93.     while(cnt != 2){
  94.         if(nearstart[si])cnt++;
  95.     //  if(cnt == 2)break;
  96.     //  printf("Into  cycle : %d\n",si);
  97.         if(si == -1)break;
  98.         cycle[si] = true;
  99.         si = color[si];
  100.     }
  101.     //printf("Test ");
  102. //  printf("Cycle : ");
  103.    
  104.     for(int i = 1 ; i <= n ; i ++){
  105.         if(!cycle[i])continue;
  106.     //  if(cycle[i])printf("%d ",i);
  107.         dfs(i);
  108.         val[i] = 1e18;
  109.     }
  110. /*  for(int i = 1 ; i <= n ; i ++){
  111.         printf("%lld ",val[i]);
  112.     }printf("\n");*/
  113.     for(int i = 0 ; i < m ; i ++){
  114.         ll x = min(val[edge[i].first],val[edge[i].second]);
  115.         if(x == 1e18){
  116.             printf("0");
  117.         }else{
  118.             printf("%lld",(n-x)*x);
  119.         }
  120.         printf(" ");
  121.     }
  122.     //while(!cycle[si])
  123.     return 0;
  124. }
  125. /*
  126. 6 6
  127. 1 2
  128. 1 3
  129. 1 4
  130. 2 3
  131. 2 5
  132. 3 6
  133.  
  134. 8 8
  135. 1 2
  136. 2 3
  137. 3 4
  138. 1 4
  139. 1 5
  140. 5 8
  141. 2 6
  142. 3 7
  143.  
  144. 2 2
  145. 1 2
  146. 2 1
  147.  
  148. 3 3
  149. 1 2
  150. 2 3
  151. 3 1
  152. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement