intfind(int x){return f[x] == x ? x : f[x] = find(f[x]);} boolmerge(int x,int y){ int fx = find(x),fy = find(y); if (!vis[fx] || !vis[fy]) {//合并的时候判断两边是否全部都有点,如果有就不连了 f[fx] = fy; if (vis[fy] == 1) vis[fx] = 1; elseif (vis[fx] == 1) vis[fy] = 1; //把连通块中关系继承 return1; } return0; }
signedmain(){ read(n,k); for (int i = 1;i <= k;++i) { int x;read(x);vis[x] = 1; } for (int i = 1;i <= n;++i) f[i] = i; for (int i = 1;i < n;++i) { read(edg[i].u,edg[i].v,edg[i].w);ans += edg[i].w; } sort(edg+1,edg+n); for (int i = 1;i < n;++i) { edge e = edg[i]; int u = e.u,v = e.v; if (merge(u,v)) ans -= e.w; //如果有边连就扣去 } printf("%lld",ans); return0; }