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;
}