abc235E 最小生成树+思维

该程序使用Kruskal算法处理图的最小生成树问题,并对q次询问进行判断,每次询问是否会影响最小生成树。通过并查集维护父子关系,如果新边连接的两个顶点不属于同一集合,则会添加到最小生成树中,并记录结果。
摘要由CSDN通过智能技术生成

题意:给定一个图,然后有q次询问,每次询问给出一条边,问如果假如这条边最小生成树是否改变。

思路:对于kru来说,如果这条边的两个端点不是一个爹那么这条边就会加入最小生成树。所以我们把这q条边全部加入图,如果他会加入最小生成树就标记一下然后跳过。

/*keep on going and never give up*/
#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
#define int long long
typedef pair<int, int> pii;
#define lowbit(x) x&(-x)
#define endl '\n'
#define wk is zqx ta die
struct node {
	int u, v, w, is;
} e[400005];
int fa[200005];
int ans[200005];
bool cmp(node a, node b) {
	return a.w < b.w;
}
int find(int x) {
	if (x == fa[x]) {
		return x;
	} else {
		fa[x] = find(fa[x]);
		return fa[x];
	}
}
signed main() {
	std::ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int n, m, q;
	cin >> n >> m >> q;
	for (int i = 1; i <= n; i++) {
		fa[i] = i;
	}
	for (int i = 1; i <= m; i++) {
		cin >> e[i].u >> e[i].v >> e[i].w;
		e[i].is = 0;
	}
	for (int i = 1; i <= q; i++) {
		cin >> e[i + m].u >> e[i + m].v >> e[i + m].w;
		e[i + m].is = i;
	}
	sort(e + 1, e + m + q + 1, cmp);
	for (int i = 1; i <= m + q; i++) {
		int x = find(e[i].u);
		int y = find(e[i].v);
		if (x != y) {
			if (e[i].is) {
				ans[e[i].is] = 1;
			} else {
				fa[x] = y;
			}
		}
	}
	for (int i = 1; i <= q; i++) {
		if (ans[i] == 0) {
			cout << "No" << endl;
		} else {
			cout << "Yes" << endl;
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值