Advertisement
Guest User

Untitled

a guest
Mar 24th, 2019
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.84 KB | None | 0 0
  1. #include <fstream>
  2. #include <vector>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7.  
  8. struct Edge {
  9.     int u, v, w;
  10.  
  11.     inline Edge(int u, int v, int w) : u(u), v(v), w(w) {}
  12. };
  13.  
  14. inline bool compare(const Edge &left, const Edge &right) {
  15.     return (left.w < right.w);
  16. }
  17.  
  18. long long edmonds(vector<Edge> &edges, int vertices, int start) {
  19.  
  20.  
  21.     vector<Edge> min_edge(vertices, Edge(-1, -1, INT_MAX));
  22.  
  23.     for (const Edge &e : edges)
  24.         min_edge[e.v] = min(min_edge[e.v], e, compare);
  25.  
  26.     for (int i = 0; i <
  27.                     vertices; i++) {
  28.         if ((min_edge[i].w == INT_MAX) && (i != start))
  29.             return INT_MAX;
  30.     }
  31.  
  32.     min_edge[start] = Edge(-1, start, 0);
  33.  
  34.  
  35.     vector<int> component(vertices, 0);
  36.     vector<bool> visited(vertices, false);
  37.     vector<bool> cycle_component(vertices, false);
  38.     int cnt = 0;
  39.     for (int i = 0; i < vertices; i++) {
  40.         if (visited[i])
  41.             continue;
  42.  
  43.         int vertex = i;
  44.         vector<int> path;
  45.         while (vertex != -1 &&
  46.                !visited[vertex]) {
  47.             visited[vertex] = true;
  48.             path.push_back(vertex);
  49.             vertex = min_edge[vertex].u;
  50.         }
  51.  
  52.         bool is_cycle = false;
  53.         for (const int &v : path) {
  54.             component[v] = cnt;
  55.             if (v == vertex) {
  56.                 cycle_component[cnt] = true;
  57.                 is_cycle = true;
  58.             }
  59.             if (!is_cycle)
  60.                 cnt++;
  61.         }
  62.  
  63.         if (is_cycle)
  64.             cnt++;
  65.     }
  66.  
  67.  
  68.     if (cnt == vertices) {
  69.         long long result = 0;
  70.         for (const Edge &e : min_edge)
  71.             result += e.w;
  72.         return result;
  73.     }
  74.  
  75.     long long result = 0;
  76.     for (const Edge &e : min_edge) {
  77.         if (cycle_component[component[e.v]])
  78.             result += e.w;
  79.     }
  80.  
  81.  
  82.     vector<Edge> new_edges;
  83.     for (const Edge &e : edges) {
  84.         int u = component[e.u];
  85.         int v = component[e.v];
  86.         int w = e.w;
  87.         if (u == v)
  88.             continue;
  89.         else new_edges.emplace_back(u, v, cycle_component[v] ? w - min_edge[e.v].w : w);
  90.     }
  91.  
  92.     long long temp = edmonds(new_edges, cnt, component[start]);
  93.     return (temp == INT_MAX) ? INT_MAX : result + temp;
  94. }
  95.  
  96. int main() {
  97.     ifstream fin("chinese.in");
  98.     ofstream fout("chinese.out");
  99.     ios_base::sync_with_stdio(false);
  100.     fin.tie(nullptr);
  101.  
  102.     int v, e;
  103.     int src, dest, w;
  104.     vector<Edge> edges;
  105.  
  106.     int start = 1;
  107.  
  108.     fin >> v >> e;
  109.     while (fin >> src >> dest >> w) {
  110.         if ((dest != start) &&
  111.             (dest != src))
  112.             edges.emplace_back(--src, --dest, w);
  113.     }
  114.  
  115.     long long mst = edmonds(edges, v, --start);
  116.  
  117.     if (mst == INT_MAX)
  118.         fout << "NO";
  119.     else
  120.         fout << "YES\n" << mst;
  121.  
  122.     fin.close();
  123.     fout.close();
  124.     return 0;
  125.  
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement