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;
 }
 }

猜你喜欢

转载自blog.csdn.net/qq_42778026/article/details/88781072
今日推荐