您的位置:首页 > 其它

NYOJ 502筹建工程

2013-04-25 20:54 141 查看
题目链接:here~~

#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdio>
#include <string.h>
using namespace std;
struct ue
{
int x, y, w;
bool operator < (ue a)const
{
return w>a.w;
}
};
priority_queue<ue> p;
int f[101];
int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
int main()
{
int N, n, m, i, j;
ue a, b;
//  freopen("in.txt", "r", stdin);
cin>>N;
while (N--)
{
while (!p.empty()) p.pop();
for (i=0;i<101;i++) f[i]=i;
cin>>n>>m;
for (i=0; i<n; i++)
{
cin>>a.x>>a.y>>a.w;
if (a.x==a.y) continue;
p.push(a);
}
if (n<m-1) {printf("No solution\n");continue;}
int k=1, res=0;
while (k<m)
{
b=p.top();
int c=find(b.x), d=find(b.y);//找到b.x的根和b.y的根
if (c!=d){res+=b.w;f[b.y]=b.x;}//如果不相等,说明两个点不属于同一个连通,所以加上这条边的权值,并让两个点相连
p.pop();//删除当前操作的边
k++;//找到m-1个边后跳出循环,m-1是最少需要的边数
}
cout<<res<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息