您的位置:首页 > 其它

专题四 · 1008

2016-07-03 22:45 204 查看

代码及解释

#include<stdio.h>
#include<string.h>
#include<algorithm>

// 并查集的应用
// 判断边的两端是否在同一个联通分量里
// 然后在最后合并成一个回路

struct node {
int u,v,val;
} edge[100005];

int set[10005], circle[10005];

int find_f(int x) {
return set[x]==x ? x : set[x] = find_f(set[x]);
}

bool merge_branch(int x,int y){
int a = find_f(x);
int b = find_f(y);
if (a == b) {
if(circle[a] == -1){
circle[a] = 1;
return true;
}
return false;
} else {
if(circle[a] == circle[b] && circle[a] == 1)
return false;
if(circle[a] == 1)
set[b] = a;
else
set[a] = b;
return true;
}
}

int cmp(node a,node b){
return a.val > b.val;
}

int main() {
int n, m;
while(scanf("%d%d",&n,&m)==2 && n && m){

for(int i=0;i<m;i++)
scanf("%d%d%d", &edge[i].u, &edge[i].v, &edge[i].val);

for(int i = 0; i < n; ++i){
set[i] = i;
circle[i] = -1;
}

std::sort(edge,edge+m,cmp);
int ans = 0;

for(int i=0;i<m;i++){
if(merge_branch(edge[i].u, edge[i].v))
ans += edge[i].val;
}

printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: