Advertisement
Guest User

Untitled

a guest
Mar 29th, 2020
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.70 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. const int N = 1005;
  7. vector <pair<long long, long long>> trGraph[N];
  8. vector <pair<long long, long long>> zeroEdges[N];
  9. vector <long long> componen;
  10. vector <long long> isConnectedGraph;
  11. vector <long long> isConnectedZeroGraph;
  12. bool visit[N];
  13.  
  14. void dfs (vector <vector<pair<long long, long long>>>& graph,long long root) {
  15. visit[root] = true;
  16. for (auto i : graph[root]) {
  17. long long t = i.first;
  18. if (!visit[t])
  19. dfs(graph, t);
  20. }
  21. isConnectedGraph.push_back(root);
  22. }
  23.  
  24. void dfsZero (long long root) {
  25. visit[root] = true;
  26. for (auto i : zeroEdges[root]) {
  27. long long t = i.first;
  28. if (!visit[t])
  29. dfsZero(t);
  30. }
  31. isConnectedZeroGraph.push_back(root);
  32. }
  33.  
  34. void trDfs(long long root, long long idx) {
  35. visit[root] = true;
  36. componen[root] = idx;
  37. for (auto i : trGraph[root]) {
  38. long long t = i.first;
  39. if (!visit[t])
  40. trDfs(t, idx);
  41. }
  42. }
  43.  
  44. long long condens(long long n) {
  45. for (long long i = 0; i < n; ++i) {
  46. visit[i] = false;
  47. }
  48.  
  49. isConnectedZeroGraph.clear();
  50.  
  51. for (long long i = 0; i < n; ++i) {
  52. if (!visit[i]) {
  53. dfsZero(i);
  54. }
  55. }
  56.  
  57. for (long long i = 0; i < n; ++i) {
  58. visit[i] = false;
  59. }
  60.  
  61. long long idx = 0;
  62. for (long long i = 0; i < n; ++i) {
  63. int t = isConnectedZeroGraph[n - 1 - i];
  64. if (!visit[t]) {
  65. ++idx;
  66. trDfs(t, idx);
  67. }
  68. }
  69.  
  70. return idx;
  71. }
  72.  
  73.  
  74. long long findMST (vector <vector<pair<long long, long long>>>& graph, long long root, long long n) {
  75. long long ans = 0;
  76. vector <long long> Min(n, INT32_MAX);
  77.  
  78. for (long long i = 0; i < n; ++i) {
  79. for (auto cur : graph[i]) {
  80. long long edge = cur.first;
  81. long long wei = cur.second;
  82. Min[edge] = min(Min[edge], wei);
  83. }
  84. }
  85.  
  86. for (long long i = 0; i < n; ++i) {
  87. if (root != i)
  88. ans = ans + Min[i];
  89. }
  90.  
  91. for (long long i = 0; i < n; ++i) {
  92. for (auto cur : graph[i]) {
  93. if (cur.second == Min[cur.first]) {
  94. cur.second = 0;
  95. zeroEdges[i].push_back(cur);
  96. }
  97. }
  98. }
  99.  
  100. for (long long i = 0; i < n; ++i) {
  101. visit[i] = false;
  102. }
  103.  
  104. dfsZero(root);
  105. if (isConnectedZeroGraph.size() == n) {
  106. return ans;
  107. }
  108.  
  109. //конденсация графа
  110. long long components = condens(n);
  111.  
  112. vector <vector<pair<long long, long long>>> resGraph(components);
  113. for (long long i = 0; i < n; ++i) {
  114. for (auto cur : graph[i]) {
  115. long long edge = cur.first;
  116. long long wei = cur.second;
  117. if (componen[i] != componen[edge])
  118. resGraph[componen[i]].emplace_back(componen[edge], wei - Min[edge]);
  119. }
  120. }
  121.  
  122. return ans + findMST(resGraph, componen[root], components);
  123. }
  124.  
  125.  
  126. int main() {
  127. freopen("chinese.in", "r", stdin);
  128. freopen("chinese.out", "w", stdout);
  129. long long n, m;
  130. cin >> n >> m;
  131. vector <vector<pair<long long, long long>>> graph(n);
  132.  
  133.  
  134. for (long long i = 0; i < n; ++i) {
  135. visit[i] = false;
  136. }
  137.  
  138. long long fir, sec, wei;
  139. for (long long i = 0; i < m; ++i) {
  140. cin >> fir >> sec >> wei;
  141. --fir;
  142. --sec;
  143. graph[fir].emplace_back(sec, wei);
  144. trGraph[sec].emplace_back(fir, wei);
  145. }
  146.  
  147. dfs(graph, 0);
  148. if (isConnectedGraph.size() == n) {
  149. cout << "YES\n";
  150. cout << findMST(graph, 0, n);
  151. }
  152. else cout <<"NO";
  153.  
  154. return 0;
  155. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement