Advertisement
Guest User

Untitled

a guest
Oct 16th, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.12 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <unordered_map>
  3.  
  4. #define int int64_t
  5. #define all(x) begin(x),end(x)
  6. #define F(i, n) for(int i = 0; i < n; ++ i)
  7.  
  8. using namespace std;
  9.  
  10. vector < vector<int> > g, gr;
  11. vector<char> used;
  12. vector<int> order, component;
  13. vector<vector<int> > components;
  14. vector<int> o;
  15.  
  16. void dfs1 (int v) {
  17. used[v] = true;
  18. for (size_t i=0; i<g[v].size(); ++i)
  19. if (!used[ g[v][i] ])
  20. dfs1 (g[v][i]);
  21. order.push_back (v);
  22. }
  23.  
  24. void dfs2 (int v) {
  25. used[v] = true;
  26. component.push_back (v);
  27. for (size_t i=0; i<gr[v].size(); ++i)
  28. if (!used[ gr[v][i] ])
  29. dfs2 (gr[v][i]);
  30. }
  31.  
  32. vector<pair<int, int> > edges0;
  33. set<pair<int, int> > st;
  34.  
  35. vector<vector<int> > d;
  36.  
  37. int32_t main() {
  38. ios_base::sync_with_stdio(false);
  39. int n, m;
  40. cin >> n >> m;
  41. d.resize(n);
  42. g.resize(n);
  43. gr.resize(n);
  44. o.resize(n);
  45. F(i, m) {
  46. int a, b;
  47. cin >> a >> b;
  48. -- a; -- b;
  49. g[a].push_back(b);
  50. gr[b].push_back(a);
  51. edges0.push_back({a, b});
  52. }
  53.  
  54. used.assign (n, false);
  55. for (int i=0; i < n; ++i) {
  56. if (!used[i]) {
  57. dfs1(i);
  58. }
  59. }
  60. used.assign (n, false);
  61. F(i, n) {
  62. int v = order[n-1-i];
  63. if (!used[v]) {
  64. dfs2 (v);
  65. F(e, component.size()) {
  66. o[component[e]] = components.size();
  67. }
  68. components.push_back(component);
  69. component.clear();
  70. }
  71. }
  72. F(e, edges0.size()) {
  73. int A = o[edges0[e].first];
  74. int B = o[edges0[e].second];
  75. if(A == B) continue;
  76. st.insert({A, B});
  77. }
  78. vector<int> cnt(components.size());
  79. for(set<pair<int, int> >::iterator iter = st.begin(); iter!=st.end(); ++ iter) {
  80. d[iter->second].push_back(iter->first);
  81. ++ cnt[iter->first];
  82. }
  83. queue<int> q;
  84. F(i, components.size()) if(!cnt[i]) q.push(i);
  85. vector<int> dp(n);
  86. int ans = 0;
  87. while(q.size()) {
  88. int t = q.front();
  89. q.pop();
  90. dp[t] += components[t].size();
  91. ans += ((int)1 - d[t].size()) * dp[t] * dp[t];
  92. F(i, d[t].size()) {
  93. int e = d[t][i];
  94. dp[e] += dp[t];
  95. -- cnt[e];
  96. if(cnt[e] == 0) q.push(e);
  97. }
  98. }
  99. cout << ans;
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement