题目1347:孤岛连通工程

题目描述:

现在有孤岛n个,孤岛从1开始标序一直到n,有道路m条(道路是双向的,如果有多条道路连通岛屿i,j则选择最短的那条),请你求出能够让所有孤岛都连通的最小道路总长度。

输入:

数据有多组输入。
每组第一行输入n(1<=n<=1000),m(0<=m<=10000)。
接着m行,每行输入一条道路i j d(0<=d<=1000),(i,j表示岛屿序号,d表示道路长度)。

输出:

对每组输入输出一行,如果能连通,输出能连通所有岛屿的最小道路长度,否则请输出字符串"no"。

样例输入:
3 5
1 2 2
1 2 1
2 3 5
1 3 3
3 1 2
4 2
1 2 3
3 4 1
样例输出:
3
no
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
struct edge{
	int u,v,w;
};

edge e[102];
int f[102];

int find(int t){
	return f[t] == t ? t : f[t] = find(f[t]);
}
bool cmp(edge a,edge b){
	return a.w < b.w;
}
int main()
{
	int i,n,m,a,b;
	while(cin >> n >> m && n){
		int ans = 0;
		int en = 0;
		for(i = 1;i <= n;i++)
			f[i] = i;
		for(i = 0;i < m;i++)
			scanf("%d %d %d",&e[i].u,&e[i].v,&e[i].w);

		sort(e,e + m,cmp);

		for(int i = 0;i < m;i++){
			int x = find(e[i].u);
			int y = find(e[i].v);
			if(x != y){
				ans += e[i].w;
				f[x] = y;
				en++;
			}
			if(en == n - 1)
				break;
		}
		if(en == n - 1)
			cout << ans << endl;
		else
			cout << "?" << endl;
	}
	return 1;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值