Guest User

Forwarding Mails UVa 12442 solution - Functional graph

a guest
Mar 20th, 2022
303
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.39 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <unordered_map>
  4. #include <cmath>
  5. #include <cstring>
  6. #include <algorithm>
  7. #include <set>
  8. #include <map>
  9. #include <queue>
  10. #include <string>
  11. #include <sstream>
  12. #include <iomanip>
  13.  
  14. using namespace std;
  15. //#define int long long
  16. const int M = 1e9 + 7;
  17. const int INF = 1e18 + 5;
  18.  
  19. const int N = 50005;
  20. vector<int> g[N];
  21. vector<int> gr[N];
  22.  
  23. //cycle
  24. int curCycle = 0;
  25. vector<int> cycleNodes[N];
  26. int nodeToCycle[N];
  27. int color[N];
  28.  
  29. // dp
  30. int dp[N];
  31.  
  32. void dfsCycle(int node){
  33.     color[node] = 1;
  34.     for(int x : g[node]){
  35.         if(color[x] == 0){
  36.             dfsCycle(x);
  37.         } else if(color[x] == 1){
  38.             // cycle found  x ... node - x
  39.             curCycle++;
  40.  
  41.             int curNode = x;
  42.             do {
  43.                 cycleNodes[curCycle].push_back(curNode);
  44.                 nodeToCycle[curNode] = curCycle;
  45.                 curNode = g[curNode][0];
  46.             } while(curNode != x);
  47.         }
  48.     }
  49.  
  50.     color[node] = 2;
  51. }
  52.  
  53. void dfs(int node, int par){
  54.     dp[node] = dp[par] + 1;
  55.     for(int x : gr[node]){
  56.         dfs(x, node);
  57.     }
  58. }
  59.  
  60. void solve(){
  61.     int n; cin >> n;
  62.     for(int i = 1; i <= n; i++){
  63.         g[i].clear();
  64.         gr[i].clear();
  65.  
  66.         curCycle = 0;
  67.         cycleNodes[i].clear();
  68.         nodeToCycle[i] = 0;
  69.         color[i] = 0;
  70.  
  71.         dp[i] = 0;
  72.     }
  73.  
  74.     for(int i = 1; i <= n; i++){
  75.         int u, v; cin >> u >> v;
  76.         g[u].push_back(v);
  77.         gr[v].push_back(u);
  78.     }
  79.  
  80.     for(int i = 1; i <= n; i++){
  81.         if(color[i] == 0){
  82.             dfsCycle(i);
  83.         }
  84.     }
  85.  
  86.     for(int i = 1; i <= curCycle; i++){
  87.         for(int x : cycleNodes[i]){
  88.             dp[x] = cycleNodes[i].size();
  89.             for(int y : gr[x]){
  90.                 if(nodeToCycle[y] == 0){
  91.                     dfs(y, x);
  92.                 }
  93.             }
  94.         }
  95.     }
  96.  
  97.     int ans = 0;
  98.     int ansNode = n + 1;
  99.     for(int i = 1; i <= n; i++){
  100.         if(dp[i] > ans){
  101.             ans = dp[i];
  102.             ansNode = i;
  103.         } else if(dp[i] == ans){
  104.             ansNode = min(ansNode, i);
  105.         }
  106.     }
  107.  
  108.     cout << ansNode << "\n";
  109. }
  110.  
  111. signed main() {
  112. //    ios_base::sync_with_stdio(false);
  113. //    cin.tie(NULL);
  114.  
  115.     int t = 1;
  116.     cin >> t;
  117.     for(int i = 1; i <= t; i++){
  118.         cout << "Case " << i << ": ";
  119.         solve();
  120.     }
  121.     return 0;
  122. }
Advertisement
Add Comment
Please, Sign In to add comment