Tarango

Forwarding Mail V.02(SCC+DAG)

Jul 1st, 2015
346
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.18 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define MAX 50005
  4. int vertex, edges;
  5.  
  6. int indegree[MAX];
  7. int deliver[MAX];
  8. int low[MAX];
  9. int disc[MAX];
  10.  
  11. bool taken[MAX];
  12. int Color[MAX];
  13.  
  14. vector<int> Graph[MAX];
  15. vector<int> n_Graph[MAX];
  16. vector<int> scc_List;
  17. stack<int> st;
  18. map<int, int> Map;
  19.  
  20. int Time = 0, color = 0;
  21.  
  22. void color_SCC(int boss) {
  23.     int Size = (int) scc_List.size();
  24.     for (int i = 0; i < Size; i++) {
  25.         boss = min(boss, scc_List[i]);
  26.     }
  27.     deliver[color] = Size - 1;
  28.     for (int i = 0; i < Size; i++) {
  29.         Color[scc_List[i]] = color;
  30.     }
  31.     Map[color] = boss;
  32.     color++;
  33. }
  34.  
  35. void build_DAG() {
  36.     for (int u = 0; u < vertex; u++) {
  37.         for (int j = 0; j < (int) Graph[u].size(); j++) {
  38.             int v = Graph[u][j];
  39.             if (Color[u] != Color[v]) {
  40.                 n_Graph[Color[u]].push_back(Color[v]);
  41.             }
  42.         }
  43.     }
  44. }
  45.  
  46. void run_Tarjan_SCC(int u) {
  47.     disc[u] = low[u] = ++Time;
  48.     taken[u] = true;
  49.     st.push(u);
  50.  
  51.     int Size = Graph[u].size();
  52.     for (int i = 0; i < Size; i++) {
  53.         int v = Graph[u][i];
  54.         if (disc[v] == -1) {
  55.             run_Tarjan_SCC(v);
  56.             low[u] = min(low[u], low[v]);
  57.         } else if (taken[v] == true) {
  58.             low[u] = min(low[u], disc[v]);
  59.         }
  60.     }
  61.     if (disc[u] == low[u]) {
  62.         scc_List.clear();
  63.         scc_List.push_back(u);
  64.         while (st.top() != u) {
  65.             int adj = st.top();
  66.             taken[adj] = false;
  67.             st.pop();
  68.             scc_List.push_back(adj);
  69.         }
  70.         int adj = st.top();
  71.         taken[adj] = false;
  72.         st.pop();
  73.         color_SCC(u);
  74.     }
  75. }
  76.  
  77. void find_SCC() {
  78.     memset(low, -1, sizeof(low));
  79.     memset(disc, -1, sizeof(disc));
  80.     memset(taken, false, sizeof(taken));
  81.     Time = -1;
  82.     for (int i = 0; i < vertex; i++) {
  83.         if (disc[i] == -1) {
  84.             run_Tarjan_SCC(i);
  85.         }
  86.     }
  87.     build_DAG();
  88. }
  89.  
  90. int visited[MAX];
  91. int max_people = 0, result = 1;
  92.  
  93. int DFS(int u) {
  94.     int cnt = 0;
  95.     for (int i = 0; i < (int) n_Graph[u].size(); i++) {
  96.         int v = n_Graph[u][i];
  97.         if (visited[v] == 0) {
  98.             visited[v] = 1;
  99.             cnt = DFS(v) + 1;
  100.         }
  101.     }
  102.     return cnt;
  103. }
  104.  
  105. int topological_sort() {
  106.     find_SCC();
  107.     for (int u = 0; u < color; u++) {
  108.         for (int j = 0; j < (int) n_Graph[u].size(); j++) {
  109.             int v = n_Graph[u][j];
  110.             indegree[v]++;
  111.         }
  112.     }
  113.     for (int u = 0; u < color; u++) {
  114.         if (indegree[u] == 0) {
  115.             memset(visited, 0, sizeof(visited));
  116.             visited[u] = 1;
  117.             int ret = DFS(u) + 1 + deliver[u];
  118.             if (ret > max_people) {
  119.                 max_people = ret;
  120.                 result = u;
  121.             }
  122.         }
  123.     }
  124.     return Map[result] + 1;
  125. }
  126.  
  127. void initialize() {
  128.     Map.clear();
  129.     color = 0;
  130.     max_people = 0;
  131.     result = 1;
  132.     memset(indegree, 0, sizeof(indegree));
  133.     memset(deliver, 0, sizeof(deliver));
  134.     for (int i = 0; i < vertex; i++) {
  135.         Graph[i].clear();
  136.         n_Graph[i].clear();
  137.     }
  138. }
  139.  
  140. void print_Graph() {
  141.     for (int i = 0; i < color; i++) {
  142.         printf("Neighbors of %d :", i);
  143.         int Size = (int) n_Graph[i].size();
  144.         for (int j = 0; j < Size; j++) {
  145.             printf(" -> %d", n_Graph[i][j]);
  146.         }
  147.         printf("\n");
  148.     }
  149. }
  150.  
  151. int main() {
  152.     int nCase, u, v;
  153.     scanf("%d", &nCase);
  154.     for (int cs = 1; cs <= nCase; cs++) {
  155.         scanf("%d", &vertex);
  156.         initialize();
  157.         for (int i = 0; i < vertex; i++) {
  158.             scanf("%d %d", &u, &v);
  159.             u--;
  160.             v--;
  161.             Graph[u].push_back(v);
  162.         }
  163.         int res = topological_sort();
  164.         printf("Case %d: %d\n", cs, res);
  165.     }
  166. }
Advertisement
Add Comment
Please, Sign In to add comment