标签:
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 19396 Accepted Submission(s): 8246
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
int n,m,k;
int u[5000],v[5000];
int w[5000];
int r[5000],p[105];
int cmp(const int i,const int j)//对w[]间接排序
{
return w[i]<w[j];
}
void read_graph()//图存储
{
for(int i=0;i<n;++i)
cin>>u[i]>>v[i]>>w[i];
}
int find(int x)//并查集查找函数
{
return p[x]==x?x:p[x]=find(p[x]);
}
void kruskal()
{
read_graph();
for(int i=0;i<=m;++i) p[i]=i;
for(int i=0;i<=n;++i) r[i]=i;
sort(r,r+n,cmp);
int ans=0;
for(int i=0;i<n;++i){
int e=r[i];
int x=find(u[e]);
int y=find(v[e]);
if(x!=y) {ans+=w[e];p[y]=x;}
}
int cnt=0;
for(int i=1;i<=m;++i) if(p[i]==i) cnt++;//计算连通分支个数
if(cnt!=1) cout<<‘?‘<<endl;//连通分支数为1时才满足条件
else cout<<ans<<endl;
}
int main()
{
while(scanf("%d%d",&n,&m)&&n)
kruskal();
return 0;
}
标签:
原文地址:http://www.cnblogs.com/orchidzjl/p/4404240.html