专题四 · 1008

来源:互联网 发布:apache ab测试百度 编辑:程序博客网 时间:2024/05/07 21:15

代码及解释

#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;}
0 0
原创粉丝点击