【ybt高效进阶3-2-3】公路建设

52 篇文章 1 订阅

公路建设

题目链接:ybt高效进阶3-2-3

题目大意

有一些点,每次会加一个边,每次加完边都问你最小生成树的值的一半是多少。
如果无法连通就输出 0 0 0,一开始没有边。

思路

其实这道题就是每次多加一条边都跑一次最小生成树。

记得初始化和判断无法连通的情况就可以了,而且输出的是答案除以 2 2 2 这个不要忘了。

(stm 我一开始还以为要 LCA 剪边一顿乱搞的,结果算算时间复杂度跟直接暴力跑最小生成树差不多,还很麻烦)

代码

#include<cstdio>
#include<algorithm>

using namespace std;

struct node {
	int x, y;
	long long z;
}a[2001], b[2001];
int n, m, fa[501], num;
long long ans;

int find(int now) {
	if (fa[now] == now) return now;
	return fa[now] = find(fa[now]);
}

bool cmp(node x, node y) {
	return x.z < y.z;
}

int main() {
	scanf("%d %d", &n, &m);
	for (int times = 1; times <= m; times++) {
		scanf("%d %d %lld", &a[times].x, &a[times].y, &a[times].z);
		
		for (int i = 1; i <= times; i++) b[i] = a[i];
		for (int i = 1; i <= n; i++) fa[i] = i;
		sort(b + 1, b + times + 1, cmp);
		
		if (times < n - 1) {
			printf("0\n");
			continue;
		}
		
		num = 0;
		ans = 0;
		for (int i = 1; i <= times; i++) {//正常跑最小生成树
			int X = find(b[i].x), Y = find(b[i].y);
			if (X == Y) continue;
			fa[X] = Y;
			num++;
			ans += b[i].z;
			if (num == n - 1) break;
		}
		
		if (num < n - 1) {
			printf("0\n");
			continue;
		}
		
		if (ans & 1) printf("%d.5\n", ans >> 1);
			else printf("%d.0\n", ans >> 1);
	}
	
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值