求助,关于mst
  • 板块灌水区
  • 楼主FANTA5TlC
  • 当前回复1
  • 已保存回复1
  • 发布时间2021/10/17 14:37
  • 上次更新2023/11/4 03:30:26
查看原帖
求助,关于mst
297798
FANTA5TlC楼主2021/10/17 14:37

rt,本人在做一道mst,大致意思是有n个点,它们之间两两有边,其中有m条边权为1的边,剩下所有的边边权为0,然后输入是这样的

n, m

u, v * m(m行,表示从u连到v的边,边权为1)

目前本人已经打好mst,问题在于如何把边权为0的边添加进去

code

#include <bits/stdc++.h>
using namespace std;
int f[5005];
int find(int u){
	if (u == f[u]) return u;
	return f[u] = find(f[u]);
}
struct P{
	int len, u, v;
}a[20005];
bool cmp(P a, P b){
	return a.len < b.len;
}
int main(){
//  	freopen(".in", "r", stdin);
//  	freopen(".out", "w", stdout);
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; ++i)
		f[i] = i;
	for (int i = 1; i <= m; ++i){
		scanf("%d%d", &a[i].u, &a[i].v)
		a[i].len = 1;
	}
	sort(a + 1, a + 1 + m, cmp);
	int ans = 0;
	int bis = 0;
	for (int i = 1; i <= m; ++i){
		if (find(a[i].u) == find(a[i].v)) continue;
		f[find(a[i].u)] = find(a[i].v);
		ans += a[i].len;
		++bis;	
		if (bis == n - 1) break;
	}
	cout << ans << endl;
}
2021/10/17 14:37
加载中...