Advertisement
Guest User

Untitled

a guest
Feb 16th, 2019
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.78 KB | None | 0 0
  1. #include<vector>
  2. #include<iostream>
  3.  
  4. class edge
  5. {
  6. public :
  7. int from , to , weight ;
  8. edge(){};
  9. edge (int mfrom , int mto , int mweight )
  10. {
  11. from = mfrom ;
  12. to = mto ;
  13. weight = mweight;
  14. }
  15. };
  16.  
  17. int dfs ( int vert , std::vector<std::vector<int>>& graph , std::vector<bool>& visited )
  18. {
  19. int result = 1;
  20. visited[vert] = true ;
  21. for (int i = 0 ; i < graph[vert].size() ;++i )
  22. {
  23. if (!visited[graph[vert][i]])
  24. result += dfs ( graph[vert][i] , graph , visited);
  25. }
  26. return result ;
  27. }
  28.  
  29. void dfs_topological (int vert , std::vector<std::vector<int>>& graph ,
  30. std::vector<bool>& visited , std::vector<int>& topological)
  31. {
  32. visited[vert] = true ;
  33. for (int i = 0 ; i < graph[vert].size() ; ++i)
  34. {
  35. if (!visited [graph[vert][i]])
  36. dfs_topological( graph[vert][i] , graph , visited , topological);
  37. }
  38. topological.push_back(vert);
  39. }
  40.  
  41. void dfs_components(int vert , int& count, std::vector<std::vector<int>>& graph ,
  42. std::vector<bool>& visited , std::vector<int>& components)
  43. {
  44. visited[vert] = true;
  45. for (int i = 0 ; i < graph[vert].size() ; ++i)
  46. {
  47. if (!visited[graph[vert][i]])
  48. dfs_components(graph[vert][i], count , graph , visited, components);
  49. }
  50. components[vert] = count ;
  51. }
  52.  
  53. std::vector<int> topologicalSort (std::vector<std::vector<int>>& graph )
  54. {
  55. std::vector<int> topological ;
  56. std::vector<bool> visited (graph.size() , false );
  57. for (int i = 0 ; i < graph.size() ; ++i)
  58. {
  59. if (!visited[i])
  60. dfs_topological(i , graph , visited , topological);
  61. }
  62. return topological ;
  63. }
  64.  
  65. std::vector<int> findComponents (std::vector<std::vector<int>>& graph ,
  66. std::vector<std::vector<int>>& t_graph,int&count)
  67. {
  68. std::vector<int> components (graph.size());
  69. std::vector<int> topological = topologicalSort (graph);
  70. std::vector<bool> visited (graph.size() , false );
  71. for (int i = topological.size() - 1; i >= 0 ; --i)
  72. {
  73. if (!visited[topological[i]])
  74. {
  75. dfs_components(topological[i] , count , t_graph , visited , components );
  76. count++;
  77. }
  78. }
  79. return components ;
  80. }
  81.  
  82. void rechargeGraph ( std::vector<edge>& edges ,std::vector<std::vector<int>>& graph ,
  83. std::vector<std::vector<int>>& t_graph )
  84. {
  85. for (int i = 0 ; i < edges.size() ; ++i)
  86. {
  87. graph[edges[i].from].push_back(edges[i].to);
  88. t_graph[edges[i].to].push_back(edges[i].from);
  89. }
  90. }
  91.  
  92. long long int findMST ( int n ,std::vector<edge>& edges ,int root )
  93. {
  94. long long int answer = 0 ;
  95. std::vector<int> min_edges (n,2000000000);
  96. for (int i = 0 ; i < edges.size() ; ++i)
  97. {
  98. min_edges[edges[i].to] = min_edges[edges[i].to] < edges[i].weight ? min_edges[edges[i].to] : edges[i].weight;
  99. }
  100. for (int i = 0 ; i < n ; ++i)
  101. {
  102. if (i != root)
  103. answer += min_edges[i];
  104. }
  105. std::vector<edge> zeroEdges ;
  106. for (int i = 0 ; i < edges.size() ; ++i)
  107. {
  108. if (edges[i].weight ==min_edges[edges[i].to])
  109. {
  110. edge box (edges[i].from,edges[i].to,edges[i].weight-min_edges[edges[i].to]);
  111. zeroEdges.push_back(box);
  112. }
  113. }
  114. std::vector<std::vector<int>> graph(n) ;
  115. std::vector<std::vector<int>> t_graph(n);
  116. std::vector<bool> visited (t_graph.size(),false);
  117. rechargeGraph(zeroEdges , graph , t_graph);
  118. if (dfs(root , graph , visited)==n)
  119. {
  120. return answer ;
  121. }
  122. int count = 0 ;
  123. std::vector<int> components = findComponents(graph , t_graph, count );
  124. std::vector<edge> newEdges;
  125. for (int i = 0 ; i < edges.size() ; ++i)
  126. {
  127. if (components[edges[i].from]!=components[edges[i].to])
  128. {
  129. edge box (components[edges[i].from],components[edges[i].to],edges[i].weight -
  130. min_edges[edges[i].to]);
  131. newEdges.push_back(box);
  132. }
  133. }
  134. answer += findMST(count , newEdges,components[root]);
  135. return answer;
  136. }
  137.  
  138. int main ()
  139. {
  140. int n , m ;
  141. std::cin>>n>>m;
  142. int v1 , v2 , weight ;
  143. std::vector<edge> edges(m);
  144. std::vector<std::vector<int>> graph(n);
  145. std::vector<std::vector<int>> t_graph (n);
  146. for (int i = 0 ; i < m ; ++i)
  147. {
  148. std::cin>>v1>>v2>>weight;
  149. edge box (v1 - 1, v2 -1 , weight);
  150. edges[i] = box;
  151. }
  152. std::vector<bool> visited (n,false);
  153. rechargeGraph(edges , graph , t_graph);
  154. if (dfs(0 , graph ,visited)==n)
  155. {
  156. std::cout<<"YES"<<"\n";
  157. std::cout<<findMST(n , edges , 0);
  158. }
  159. else
  160. {
  161. std::cout<<"NO";
  162. }
  163. return 0 ;
  164. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement