专题四 · 1008
Posted suamfadmp
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了专题四 · 1008相关的知识,希望对你有一定的参考价值。
代码及解释
#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;
以上是关于专题四 · 1008的主要内容,如果未能解决你的问题,请参考以下文章
【离散数学】图论(四)哈密顿回路(Hamiltonian cycle)