tankwoks

POJ 1639

Apr 4th, 2017
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.18 KB | None | 0 0
  1. #include <set>
  2. #include <map>
  3. #include <list>
  4. #include <cmath>
  5. #include <queue>
  6. #include <stack>
  7. #include <vector>
  8. #include <bitset>
  9. #include <string>
  10. #include <cctype>
  11. #include <cstdio>
  12. #include <cstring>
  13. #include <cstdlib>
  14. #include <iostream>
  15. #include <algorithm>
  16. // #include <unordered_map>
  17.  
  18. using namespace std;
  19.  
  20. typedef long long ll;
  21. typedef unsigned long long ull;
  22. typedef pair<int, int> pii;
  23. typedef pair<ull, ull> puu;
  24.  
  25. #define inf (0x3f3f3f3f)
  26. #define lnf (0x3f3f3f3f3f3f3f3f)
  27. #define eps (1e-9)
  28. #define fi first
  29. #define se second
  30.  
  31. bool sgn(double a, string select, double b) {
  32.     if(select == "==")return fabs(a - b) < eps;
  33.     if(select == "!=")return fabs(a - b) > eps;
  34.     if(select == "<")return a - b < -eps;
  35.     if(select == "<=")return a - b < eps;
  36.     if(select == ">")return a - b > eps;
  37.     if(select == ">=")return a - b > -eps;
  38. }
  39.  
  40.  
  41. //--------------------------
  42.  
  43. const ll mod = 1000000007;
  44. const int maxn = 30;
  45.  
  46. struct Edge {
  47.     int u, v, d;
  48.     Edge() {}
  49.     Edge(int a, int b, int c): u(a), v(b), d(c) {}
  50.     bool operator<(const Edge &e)const {
  51.         return d < e.d;
  52.     }
  53. };
  54.  
  55. int n, m, k;
  56. int cnt;
  57. int ans;
  58. int parent[maxn];
  59. map<string, int> nodes;
  60. vector<Edge>edges;
  61. int g[maxn][maxn];
  62. bool tree[maxn][maxn];
  63. int minEdge[maxn];
  64. Edge dp[maxn];
  65.  
  66. int find(int p) {
  67.     if(p == parent[p])return p;
  68.     else return parent[p] = find(parent[p]);
  69. }
  70.  
  71. void un(int p, int q) {
  72.     parent[find(p)] = find(q);
  73. }
  74.  
  75. void Kruskal() {
  76.     sort(edges.begin(), edges.end());
  77.     for(int i = 0; i < edges.size(); i++) {
  78.         int p = edges[i].u;
  79.         int q = edges[i].v;
  80.         if(p == 1 || q == 1)continue;
  81.         if(find(p) != find(q)) {
  82.             un(p, q);
  83.             tree[p][q] = tree[q][p] = 1;
  84.             ans += edges[i].d;
  85.         }
  86.     }
  87. }
  88.  
  89. void dfs(int cur, int pre) {
  90.     for(int i = 2; i <= cnt; i++) {
  91.         if(i == pre || !tree[cur][i])continue;
  92.         if(dp[i].d == -1) {
  93.             if(dp[cur].d > g[cur][i])dp[i] = dp[cur];
  94.             else {
  95.                 dp[i].u = cur;
  96.                 dp[i].v = i;
  97.                 dp[i].d = g[cur][i];
  98.             }
  99.         }
  100.         dfs(i, cur);
  101.     }
  102. }
  103.  
  104.  
  105. void init() {
  106.     memset(g, inf, sizeof(g));
  107.     memset(tree, 0, sizeof(tree));
  108.     memset(minEdge, inf, sizeof(minEdge));
  109.     m = 0;
  110.     cnt = 1;
  111.     ans = 0;
  112.     nodes["Park"] = 1;
  113.     for(int i = 0; i < maxn; i++) {
  114.         parent[i] = i;
  115.     }
  116. }
  117.  
  118. void solve() {
  119.     scanf("%d", &n);
  120.     string s1, s2;
  121.     int d;
  122.     init();
  123.     for(int i = 1; i <= n; i++) {
  124.         cin >> s1 >> s2 >> d;
  125.         if(!nodes[s1])nodes[s1] = ++cnt;
  126.         if(!nodes[s2])nodes[s2] = ++cnt;
  127.         int u = nodes[s1];
  128.         int v = nodes[s2];
  129.         edges.push_back(Edge(u, v, d));
  130.         g[u][v] = g[v][u] = min(g[u][v], d);
  131.     }
  132.     scanf("%d", &k);
  133.     Kruskal();
  134.     int keyPoint[maxn];
  135.     for(int i = 2; i <= cnt; i++) {
  136.         if(g[1][i] != inf) {
  137.             int color = find(i);
  138.             if(minEdge[color] > g[1][i]) {
  139.                 minEdge[color] = g[1][i];
  140.                 keyPoint[color] = i;
  141.  
  142.             }
  143.         }
  144.     }
  145.     for(int i = 1; i <= cnt; i++) {
  146.         if(minEdge[i] != inf) {
  147.             m++;
  148.             tree[1][keyPoint[i]] = tree[keyPoint[i]][1] = 1;
  149.             ans += g[1][keyPoint[i]];
  150.         }
  151.     }
  152.     for(int i = m + 1; i <= k; i++) {
  153.         memset(dp, -1, sizeof(dp));
  154.         dp[1].d = -inf;
  155.         for(int j = 2; j <= cnt; j++)
  156.             if(tree[1][j])
  157.                 dp[j].d = -inf;
  158.         dfs(1, -1);
  159.         int idx, minnum = inf;
  160.         for(int j = 2; j <= cnt; j++) {
  161.             if(minnum > g[1][j] - dp[j].d) {
  162.                 minnum = g[1][j] - dp[j].d;
  163.                 idx = j;
  164.             }
  165.         }
  166.         if(minnum >= 0)
  167.             break;
  168.         tree[1][idx] = tree[idx][1] = 1;
  169.         tree[dp[idx].u][dp[idx].v] = tree[dp[idx].v][dp[idx].u] = 0;
  170.         ans += minnum;
  171.     }
  172.     printf("Total miles driven: %d\n", ans);
  173. }
  174.  
  175. int main() {
  176.  
  177. #ifndef ONLINE_JUDGE
  178.     freopen("1.in", "r", stdin);
  179.     // freopen("1.out", "w", stdout);
  180. #endif
  181.     // iostream::sync_with_stdio(false);
  182.     solve();
  183.     return 0;
  184. }
Advertisement
Add Comment
Please, Sign In to add comment