xcoj 1203 F.铺设电缆

题目描述

         Neo最近负责了合肥工业大学宣城校区的电缆铺设工程。假设现在合肥工业大学宣城校区没有任何电缆。已知合肥工业大学宣城校区一共有n用电建筑,已经编号为1n。其中任意两个城镇可能有一条管道供电缆铺设,也可能没有。如果两个建筑之间有管道pi并且有一个长度si,则Neo可以在这两个建筑之间铺一条电缆线,电缆线的长度也就是这条路的长度si

现在Neo准备了长为s的电缆线,电缆线可以任意拆断,拆断不损失任何电缆线。他需要将所有用电建筑连入电缆网络。那么,Neo能不能使用这根电缆线完成这项工作;如果能够完成,那么Neo最少耗用多长的电缆线呢?

输入

第一行一个正实数S

第二行一个正整数n

接下来有若干行,第i行有两个整数xi,yi和一个实数si,表示编号为xi的建筑和编号为yi的建筑之间有管道,长度为si

输入保证xi不等于yi

输出

      若能够完成(建立这样的电缆网络),则输出(其中<X>代表最少的电缆线长度,保留两位小数):Need <X> miles of cable
      否则输出: Impossible

样例输入

100.041 2 2.01 3 4.21 4 6.73 4 4.02 4 10.0

样例输出

Need 10.20 miles of cable



邻接矩阵会爆...


#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long LL;
const int MAXN = 100007;
const int MAXM = 100007;
int F[MAXN];
struct Edge {
	int u, v;
	double w;
}edge[MAXM];
int tol;
void addedge(int u, int v, double w) {
	edge[tol].u = u;
	edge[tol].v = v;
	edge[tol++].w = w;
}
bool cmp(Edge a, Edge b) {
	return a.w<b.w;
}
int find(int x) {
	if (F[x] == -1)return x;
	else return F[x] = find(F[x]);
}
double Kruskal(int n)
{
	memset(F, -1, sizeof(F));
	sort(edge, edge + tol, cmp);
	int cnt = 0;
	double ans = 0;
	for (int i = 0; i<tol; i++) {
		int u = edge[i].u;
		int v = edge[i].v;
		double w = edge[i].w;
		int t1 = find(u);
		int t2 = find(v);
		if (t1 != t2) {
			ans += w;
			F[t1] = t2;
			cnt++;
		}
		if (cnt == n - 1)break;
	}
	if (cnt<n - 1)return -1;
	else return ans;
}


int main() {
	double su;
	cin >> su;

	int num;
	cin >> num;

	tol = 0;
	int x, y;
	double len;
	while (cin >> x >> y >> len) {
		addedge(x, y, len);

	}

	double ans = Kruskal(1);
	

	if (ans != -1) {
		printf("Need %.2f miles of cable\n", ans);
	}
	else {
		printf("Impossible\n");
	}
	///
	return 0;
}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值