http://acm.hdu.edu.cn/showproblem.php?pid=3367
题目 | 算法 | 备注 |
求一个图中最长路,每个联通分量里最多有一个环 | 有点像克鲁斯卡尔 +并查集 | |
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
using namespace std;
struct node
{
int p,q,c;
}a[100001];
int f[10001];
bool b[10001];
int cmp(node a,node b)
{
return a.c>b.c;
}
bool merge(int x,int y)
{
int fa,fb;
fa=x;
fb=y;
while(fa!=f[fa])fa=f[fa];
while(fb!=f[fb])fb=f[fb];
if(fa==fb)
{
if(b[fa]==false)
{
b[fa]=true;
return true;
}
else return false;
}
if(b[fa]==true&&b[fb]==true)return false;
if(b[fa]==true)
{
f[fb]=f[fa];
return true;
}
else
{
f[fa]=f[fb];
return true;
}
return true;
}
int main()
{
int m,n,i,max;
while(~scanf("%d%d",&n,&m))
{
if(n==0&&m==0)break;
for(i=0; i<m; i++)
{
scanf("%d%d%d",&a[i].p,&a[i].q,&a[i].c);
}
sort(a,a+m,cmp);
for(i=0; i<=n; i++)
{
f[i]=i;
b[i]=false;
}
max=0;
for(i=0;i<m;i++)
{
if(merge(a[i].p,a[i].q)==true)
{
max=max+a[i].c;
}
}
printf("%d\n",max);
}
}