xynuoj 1384 畅通工程2
思想:本题考的就是最小生成树,可以用kruskal算法,下面是模板
代码:
#include<iostream>
using namespace std;
#include<string.h>
#include<algorithm>
int bin[105],n,m;
struct hyf
{
int x,y,value;
}p[105];
bool cmp(struct hyf a,struct hyf b)
{
return a.value<b.value;
}
int findx(int x)
{
int r=x;
while(r!=bin[r])
r=bin[r];
return r;
}
void fun(int x,int y)
{
int tx,ty;
tx=findx(x);
ty=findx(y);
if(tx!=ty)
bin[tx]=ty;
}
int main()
{
int i,j,tx,ty,tz;
while(cin>>n>>m)
{
if(n==0)break;
for(i=1;i<=m;i++)
bin[i]=i;
for(i=0;i<n;i++)
cin>>p[i].x>>p[i].y>>p[i].value;
sort(p,p+n,cmp);
int res=m,ans=0;
for(i=0;i<n;i++)
{
if(res>1)
{ tx=p[i].x;ty=p[i].y;tz=p[i].value;
if(findx(tx)==findx(ty))//判断是否属于同一个集合
continue;
else
{
fun(tx,ty);//把两点连接起来
res--;
ans=ans+tz;
}
}
}
if(res==1)//判断是否构建成功
cout<<ans<<endl;
else cout<<"?"<<endl;
}
}