Dang_Quan_10_Tin

Untitled

Jul 4th, 2020
217
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.41 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cstdio>
  4. #include <unordered_set>
  5. #include <map>
  6. #include <stack>
  7. #define task "NEWROADS"
  8. using namespace std;
  9. using ll = long long;
  10. using ld = long double;
  11.  
  12. const int N = 2e5 + 2;
  13. int n, m;
  14. vector<int> s;
  15. unordered_set<int> adj[N], nadj[N];
  16. int lt[N];
  17. ll cnt[N], have[N];
  18. int l(0), a[N], b[N];
  19. bool vis[N];
  20.  
  21. void Read(){
  22.     cin >> n >> m;
  23.     for(int i = 1; i <= m; ++i){
  24.         cin >> a[i] >> b[i];
  25.         if(adj[a[i]].find(b[i]) != adj[a[i]].end()){
  26.             --i; --m;
  27.             continue;
  28.         }
  29.         adj[a[i]].insert(b[i]);
  30.         nadj[b[i]].insert(a[i]);
  31.     }
  32. }
  33.  
  34. void dfs(int v){
  35.     vis[v] = 1;
  36.     for(auto i : adj[v])
  37.         if(!vis[i])
  38.             dfs(i);
  39.     s.push_back(v);
  40. }
  41.  
  42. void dfs_component(int v){
  43.     lt[v] = l;
  44.     ++cnt[l];
  45.     for(auto i : nadj[v])
  46.         if(lt[i] == 0)
  47.             dfs_component(i);
  48. }
  49.  
  50. void Kosaraju(){
  51.     for(int i = 1; i <= n; ++i)
  52.         if(!vis[i])
  53.             dfs(i);
  54.     while(s.size()){
  55.         int c = s.back();
  56.         s.pop_back();
  57.         if(lt[c] != 0)
  58.             continue;
  59.         ++l;
  60.         dfs_component(c);
  61.     }
  62. }
  63.  
  64. void Solve(){
  65.     Kosaraju();
  66.     for(int i = 1; i <= m; ++i)
  67.         if(lt[a[i]] == lt[b[i]])
  68.             ++have[lt[a[i]]];
  69.     ll ans = 0;
  70.     for(int i = 1; i <= l; ++i)
  71.         ans += cnt[i] * (cnt[i] - 1ll) - have[i];
  72.     cout << ans;
  73. }
  74.  
  75. main(){
  76.     ios::sync_with_stdio(0);
  77.     cin.tie(0);
  78.     cout.tie(0); if(fopen(task".INP", "r"))
  79.     freopen(task".INP", "r", stdin),
  80.     freopen(task".OUT", "w", stdout);
  81.     Read();
  82.     Solve();
  83. }
Advertisement
Add Comment
Please, Sign In to add comment