题目链接:
思路:初始时一条边都不加,将所有边按权值从大到小排序,判断每一个边两端的顶点是否是均为machine节点,如果是则应删除这条边(即sum要加上这条边的权值),否则加入这条边,然后在并查集合并时尽量让根节点为machine节点。
1 #include2 #include 3 #include 4 #include 5 using namespace std; 6 #define MAXN 100010 7 typedef long long ll; 8 int n,k; 9 int parent[MAXN];10 bool mark[MAXN];11 struct Edge{12 int u,v,w;13 }edge[MAXN];14 ll sum;15 16 int cmp(const Edge &p,const Edge &q){17 return p.w>q.w;18 }19 20 int Find(int x){21 int s;22 for(s=x;s!=parent[s];s=parent[s])23 ;24 while(s!=x){25 int tmp=parent[x];26 parent[x]=s;27 x=tmp;28 }29 return s;30 }31 32 void Union(int u,int v){33 if(mark[u])parent[v]=u;34 else if(mark[v])parent[u]=v;35 else if(u