Advertisement
Guest User

Untitled

a guest
Sep 12th, 2013
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.30 KB | None | 0 0
  1. /*
  2.  * File:     main.cpp
  3.  * Author:   Hrayr [HarHro94]
  4.  * Problem:
  5.  * IDE:      Visual C++ 2012
  6.  */
  7. //#pragma comment(linker, "/STACK:66777216")
  8. #define _CRT_SECURE_NO_WARNINGS
  9. #include <functional>
  10. #include <algorithm>
  11. #include <iostream>
  12. #include <sstream>
  13. #include <fstream>
  14. #include <cassert>
  15. #include <iomanip>
  16. #include <cstring>
  17. #include <cstdio>
  18. #include <string>
  19. #include <vector>
  20. #include <ctime>
  21. #include <queue>
  22. #include <stack>
  23. #include <cmath>
  24. #include <set>
  25. #include <map>
  26. using namespace std;
  27.  
  28. typedef long long LL;
  29. typedef long double LD;
  30. #define pb push_back
  31. #define mp make_pair
  32. #define all(v) (v).begin(), (v).end()
  33. #define sz(v) (int)(v).size()
  34.  
  35. const int INF = 1000000000;
  36. const int N = 30;
  37.  
  38. int n, m, c, G[N][N];
  39. map<string, int> id;
  40. set<string> S;
  41. string na[N], nb[N];
  42. int dist[N];
  43.  
  44. struct Edge
  45. {
  46.     int u, v, w;
  47.     Edge(int u = 0, int v = 0, int w = 0) : u(u), v(v), w(w) { }
  48.     bool operator < (const Edge &o) const
  49.     {
  50.         return w < o.w;
  51.     }
  52. };
  53. vector<Edge> edge;
  54.  
  55. struct DSU
  56. {
  57.     int size[N], par[N];
  58.  
  59.     void init()
  60.     {
  61.         for (int i = 0; i < N; ++i)
  62.         {
  63.             size[i] = 1;
  64.             par[i] = i;
  65.         }
  66.     }
  67.  
  68.     int getpar(int u)
  69.     {
  70.         return u == par[u] ? u : par[u] = getpar(par[u]);
  71.     }
  72.  
  73.     void unite(int u, int v, int w, int &cur)
  74.     {
  75.         int p = getpar(u);
  76.         int q = getpar(v);
  77.         if (p == q) return;
  78.         cur += w;
  79.         if (size[p] > size[q]) swap(p, q);
  80.         size[q] += size[p];
  81.         par[p] = q;
  82.     }
  83.  
  84. } dsu;
  85.  
  86. int main()
  87. {
  88. #ifdef harhro94
  89.     freopen("input.txt", "r", stdin);
  90.     freopen("output.txt", "w", stdout);
  91. #else
  92.     //freopen(task".in", "r", stdin);
  93.     //freopen(task".out", "w", stdout);
  94. #endif
  95.  
  96.     cin >> m;
  97.     for (int i = 0; i < m; ++i)
  98.     {
  99.         cin >> na[i] >> nb[i] >> dist[i];
  100.         S.insert(na[i]);
  101.         S.insert(nb[i]);
  102.     }
  103.     cin >> c;
  104.     for (auto it = S.begin(); it != S.end(); ++it)
  105.         id[*it] = n++;
  106.  
  107.     int park = id["Park"];
  108.     for (int i = 0; i < m; ++i)
  109.     {
  110.         int u = id[na[i]];
  111.         int v = id[nb[i]];
  112.         edge.pb(Edge(u, v, dist[i]));
  113.         if (G[u][v] == 0)
  114.             G[u][v] = G[v][u] = dist[i];
  115.         else
  116.             G[u][v] = min(G[u][v], dist[i]),
  117.                       G[v][u] = min(G[v][u], dist[i]);
  118.     }
  119.     sort(all(edge));
  120.     vector<int> adj;
  121.     for (int i = 0; i < n; ++i)
  122.         if (i != park && G[i][park]) adj.pb(i);
  123.     int nx = sz(adj);
  124.     int ans = INF;
  125.     for (int mask = 0; mask < (1 << nx); ++mask)
  126.     {
  127.         int cnt = 0;
  128.         for (int j = 0; j < nx; ++j)
  129.             if ((mask >> j) & 1) ++cnt;
  130.         if (cnt > c) continue;
  131.         dsu.init();
  132.         int cur = 0;
  133.         for (int j = 0; j < nx; ++j)
  134.             if ((mask >> j) & 1) dsu.unite(park, adj[j], G[park][adj[j]], cur);
  135.         for (int i = 0; i < m; ++i)
  136.             if (edge[i].u != park && edge[i].v != park)
  137.                 dsu.unite(edge[i].u, edge[i].v, edge[i].w, cur);
  138.         if (dsu.size[dsu.getpar(0)] == n)
  139.             ans = min(ans, cur);
  140.     }
  141.     cout << "Total miles driven: " << ans << endl;
  142.  
  143. #ifdef harhro94
  144.     cerr << fixed << setprecision(3) << "\nExecution time = " << clock() / 1000.0 << "s\n";
  145. #endif
  146.     return 0;
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement