tjut 4313

来源:互联网 发布:mac os更新系统失败 编辑:程序博客网 时间:2024/05/16 14:07
#include <iostream>  #include <cstring>  #include <cstdio>  #include <algorithm>  #include <cmath>  #include <vector>    using namespace std;    const int maxn = 100010;  int t, n, k;  int mach[maxn], father[maxn];    struct Edge {      int u, v, c;  }edge;  vector<Edge> vv;    bool cmp(Edge a, Edge b)  {      return a.c > b.c;  }    void initSet()  {      for (int i = 0; i < maxn; ++i) {          father[i] = i;          mach[i] = 0;      }  }    int find(int x)  {      if (x != father[x]) {          father[x] = find(father[x]);      }      return father[x];  }    void merge(int a, int b)  {      a = find(a);      b = find(b);      if (a == b) return ;      if (a < b) {          father[b] = a;          mach[a] += mach[b];      } else {          father[a] = b;          mach[b] += mach[a];      }  }    int main()  {      scanf("%d", &t);      while (t--) {          scanf("%d%d", &n, &k);          vv.clear();          initSet();          int u, v, c;          __int64 ans = 0;          for (int i = 0; i < n - 1; ++i) {              scanf("%d%d%d", &u, &v, &c);              edge.u = u; edge.v = v; edge.c = c;              vv.push_back(edge);              ans += c;          }          for (int i = 0; i < k; ++i) {              scanf("%d", &u);              mach[u] = 1;          }          sort(vv.begin(), vv.end(), cmp);          for (int i = 0; i < n - 1; ++i) {              u = find(vv[i].u);              v = find(vv[i].v);              if (mach[u] + mach[v] <= 1) {                  merge(u, v);                  ans -= vv[i].c;              }          }          printf("%I64d\n", ans);      }      return 0;  } 

0 0
原创粉丝点击