Monday, January 28, 2019

[UVa] 10510 - Cactus

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : 10510 - Cactus
Source            : Spoj
Category          : Graph Theory, Strongly Connected Components
Algorithm         : Tarjan Algorithm
Verdict           : Accepted

  1. #include <bits/stdc++.h>  
  2.   
  3. using namespace std;  
  4.   
  5. static const int maxn = 1e5 + 5;  
  6.   
  7. vector <int> graph[maxn];  
  8.   
  9. int father[maxn];  
  10. int part_a_cycle[maxn];  
  11. int sccno[maxn];  
  12. int discovery[maxn], low[maxn];  
  13. bool vis[maxn];  
  14. int dfsTime;  
  15. bool cactus;  
  16. int tSCC;  
  17. stack <int> S;  
  18.   
  19. inline void print_Nodes_Of_A_Cycle(int v, int u)  
  20. {  
  21.     while (father[u] != v)  
  22.     {  
  23.         part_a_cycle[u]++;  
  24.         if (part_a_cycle[u] > 1)  
  25.         {  
  26.             cactus = false;  
  27.             return;  
  28.         }  
  29.         u = father[u];  
  30.     }  
  31. }  
  32.   
  33. inline void tarjan(int u)  
  34. {  
  35.     vis[u] = 1;  
  36.     discovery[u] = low[u] = ++dfsTime;  
  37.     S.push(u);  
  38.     for (int v : graph[u])  
  39.     {  
  40.         if (!vis[v])  
  41.         {  
  42.             father[v] = u;  
  43.             tarjan(v);  
  44.             low[u] = min(low[u], low[v]);  
  45.         }  
  46.         else if (vis[v])  
  47.         {  
  48.             low[u] = min(low[u], discovery[v]);  
  49.             print_Nodes_Of_A_Cycle(v, u);  
  50.             if (cactus == falsereturn;  
  51.         }  
  52.     }  
  53.     if (discovery[u] == low[u]) // find a SCC  
  54.     {  
  55.         tSCC++;  
  56.         if (tSCC > 1)  
  57.         {  
  58.             cactus = false;  
  59.             return;  
  60.         }  
  61.         while (true)  // print the nodes of the SCC  
  62.         {  
  63.             int node = S.top(); S.pop();  
  64.             sccno[node] = tSCC;  
  65.             vis[node] = 0;  // update it 0 to not enter a cross edge  
  66.             if (node == u) break;  
  67.         }  
  68.     }  
  69. }  
  70.   
  71. inline void initialize()  
  72. {  
  73.     cactus = true;  
  74.     dfsTime = 0;  
  75.     tSCC = 0;  
  76.     for (int i = 0; i < maxn; i++)  
  77.     {  
  78.         graph[i].clear();  
  79.         discovery[i] = 0;  
  80.         low[i] = 0;  
  81.         vis[i] = 0;  
  82.         sccno[i] = 0;  
  83.         part_a_cycle[i] = 0;  
  84.     }  
  85.     while (!S.empty()) S.pop();  
  86. }  
  87.   
  88. void findSCC(int tnode)  
  89. {  
  90.     for (int i = 0; i < tnode; i++)  
  91.     {  
  92.         if (!discovery[i])  
  93.         {  
  94.             tarjan(i);  
  95.             if (cactus == falsereturn;  
  96.         }  
  97.     }  
  98. }  
  99.   
  100.   
  101. int main()  
  102. {  
  103.     int tc;  
  104.     cin >> tc;  
  105.     for (int tcase = 1; tcase <= tc; tcase++)  
  106.     {  
  107.         initialize();  
  108.         int tnode, tedge;  
  109.         cin >> tnode >> tedge;  
  110.         for (int e = 0; e < tedge; e++)  
  111.         {  
  112.             int u, v;  
  113.             cin >> u >> v;  
  114.             graph[u].push_back(v);  
  115.         }  
  116.         findSCC(tnode);  
  117.         if (cactus == true) cout << "YES" << endl;  
  118.         else cout << "NO" << endl;  
  119.     }  
  120. }  

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.