bingxuan9112

噁 TIOJ 1727

Feb 28th, 2020
303
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.86 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. const int N = 8025;
  5. const long long INF = 1e18;
  6.    
  7. int n, k;
  8. int x[N], y[N], c[N];
  9. inline int dist(int a, int b) {
  10.     return (x[a]-x[b]) * (x[a]-x[b]) + (y[a]-y[b]) * (y[a]-y[b]);
  11. }
  12. struct edge {
  13.     int to, prv, nxt, cost;
  14. } E[N];
  15. int head[N], tot;
  16. void addedge(int a, int b, int c) {
  17.     E[tot] = {b, -1, head[a], c}, head[a] = E[head[a]].prv = tot++;
  18.     E[tot] = {a, -1, head[b], c}, head[b] = E[head[b]].prv = tot++;
  19. }
  20. void deledge(int id) {
  21.     if(~E[id].nxt) E[E[id].nxt].prv = E[id].prv;
  22.     if(~E[id].prv) E[E[id].prv].nxt = E[id].nxt;
  23.     int i = E[id^1].to;
  24.     if(id == head[i]) head[i] = E[id].nxt, E[head[i]].prv = -1;
  25. }
  26. int mxe[N], val[N];
  27. bool used[N];
  28. void dfs(int i, int p = -1, int e = -1) {
  29.     mxe[i] = e;
  30.     for(int id = head[i]; ~id; id = E[id].nxt) {
  31.         int j = E[id].to;
  32.         if(j == p) continue;
  33.         dfs(j, i, ~e && E[e].cost>E[id].cost ? e : id);
  34.     }
  35. }
  36. long long solve() {
  37.     long long ans = 0, res = INF;
  38.     {
  39.         // read-in and init
  40.         cin >> n >> k;
  41.         if(k > n) k = n;
  42.         for(int i = 1; i <= n; i++) cin >> x[i] >> y[i] >> c[i];
  43.         for(int i = 0; i <= n; i++) head[i] = -1, used[i] = false;
  44.         tot = 0;
  45.     }
  46.     {
  47.         // MST
  48.         vector<bool> ok(n+1);
  49.         vector<int> d(n+1, INF), fr(n+1, -1);
  50.         auto relax = [&](int x) {
  51.             for(int i = 1; i <= n; i++) if(!ok[i]) {
  52.                 if(d[i] > dist(i,x))
  53.                     d[i] = dist(i,x), fr[i] = x;
  54.             }
  55.         };
  56.         ok[1] = true;
  57.         relax(1);
  58.         for(int t = 1; t < n; t++) {
  59.             int mn = 0;
  60.             for(int i = 1; i <= n; i++) if(!ok[i])
  61.                 if(mn == 0 || d[mn] > d[i])
  62.                     mn = i;
  63.             // cout << fr[mn] << ' ' << mn << ' ' << d[mn] << '\n';
  64.             addedge(fr[mn], mn, d[mn]);
  65.             ans += d[mn];
  66.             ok[mn] = true;
  67.             relax(mn);
  68.         }
  69.     }
  70.     res = ans;
  71.     if(k == 0) return res;
  72.     {
  73.         // MST with smallest degree of v0
  74.         int s = min_element(c+1, c+n+1) - c;
  75.         addedge(0, s, c[s]);
  76.         ans += c[s];
  77.         used[s] = true;
  78.         // cout << ans << '\n';
  79.     }
  80.     {
  81.         // iterate and calc m+1 from m
  82.         for(int deg = 1; deg < k; deg++) {
  83.             dfs(0);
  84.             for(int i = 1; i <= n; i++) val[i] = used[i] ? INF : c[i] - E[mxe[i]].cost;
  85.             int j = min_element(val+1, val+n+1) - val;
  86.             assert(val[j] != INF);
  87.             deledge(mxe[j]), deledge(mxe[j]^1);
  88.             addedge(0, j, c[j]);
  89.             ans += val[j];
  90.             used[j] = true;
  91.             res = min(res, ans);
  92.         }
  93.     }
  94.     return res;
  95. }
  96. signed main() {
  97.     int t;
  98.     cin >> t;
  99.     while(t--) cout << solve() << '\n';
  100. }
  101.  
  102. /*
  103. 1
  104. 3 0
  105. 0 6 1
  106. 0 0 1
  107. 8 0 1
  108. */
Advertisement
Add Comment
Please, Sign In to add comment