[nbut 1405] bridge and island

传送门: http://acm.nbut.cn/Problem/view.xhtml?id=1405
题目大意: 为了加强岛之间的通信,政府想要建造一些岛屿之间的桥梁。现在,政府给你每个岛之间的成本,你能找到方法来构建桥梁连接所有岛屿但成本最低的钱。也就是使得所有岛连通所消耗的钞票最少。。。那么就是最小生成树。
代码如下:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int u[1000];
int v[1000];
int w[1000];
int p[1000];
int r[1000];
int n,m;
int cmp(const int i, const int j) //间接排序函数
{
return w[i] < w[j];
}
int find(int x)//并查集的find
{
return p[x] == x ? x : p[x] = find(p[x]);
}
int kruskal()
{
int ans = 0;
for(int i = 0; i < n; i++)//初始化并查集
{
p[i] = i;
}
for(int i = 0; i < m; i++)//初始化边序号
{
r[i] = i;
}
sort(r, r + m, cmp);//给边排序
for(int i = 0; i < m; i++)
{
int e = r[i];
int x = find(u[e]);
int y = find(v[e]);//找出当前边两个端点所在集合编号
if(x != y)//在不同集合,合并
{
ans += w[e];
p[x] = y;
}
}
return ans;
}
int main()
{
while(~scanf("%d %d", &n, &m))
{
memset(p, 0, sizeof(p));
memset(r, 0, sizeof(r));
for(int i = 0; i < m; i++)
{
scanf("%d %d %d", &u[i], &v[i], &w[i]);
}
printf("%d\n", kruskal());
}
return 0;
}

黑赵晓,我们特专业

你可能感兴趣的:([nbut 1405] bridge and island)