思路:
考虑一下如果一个点在环上,显然删掉关键点连着的边不会亏,所以肯定存在一种方案只删去连接关键点的边。
所以我们可以优先连接所有的非关键点的边,然后剩下的跑一个类似最小生成树的就好了。
#include <cstdio>
#include <iostream>
#define N 1000010
using namespace std;
int n, m, k, i, ans;
int f[N], x[N << 1], y[N << 1];
inline int read()
{
int res = 0;
char c;
c = getchar();
while('0' <= c && c <= '9') {res = res * 10 + (c - '0'); c = getchar();}
return res;
}
int find(int x) {return x == f[x] ? x : f[x] = find(f[x]);}
int main()
{
n = read(), m = read(), k = read();
for(i = 1; i <= n; i ++) f[i] = i;
for(i = 1; i <= m; i ++)
{
x[i] = read(); y[i] = read();
if(x[i] > k && y[i] > k) f[find(x[i])] = find(y[i]);
}
for(i = 1; i <= m; i ++)
if(x[i] <= k || y[i] <= k)
{
if(find(x[i]) == find(y[i])) ans ++ ;
else f[f[x[i]]] = f[y[i]];
}
printf("%d\n", ans);
return 0;
}