PAT 1013. Battle Over Cities (25)
http://www.patest.cn/contests/pat-a-practise/1013
n个节点形成一棵树需n-1条边, 减去已有的边数就是需要重新修建的
#include<stdio.h> #include<math.h> #include<string.h> #define MAXN 1100*1100 int p[MAXN]; int u[MAXN], v[MAXN]; int n, m, k; int find(int x) { return p[x] == x ? x : (p[x] = find(p[x])); } int kruskal(int city) { int ans = 0; for (int i = 0; i <= n; ++i) p[i] = i; for(int i = 0; i < m; ++i) { if (u[i] == city || v[i] == city) continue; int x = find(u[i]); int y = find(v[i]); if (x != y) { ++ans; p[x] = y; } } return ans; } int main() { //freopen("input", "r", stdin); scanf("%d%d%d", &n, &m, &k); for (int i = 0; i < m; ++i) { scanf("%d%d", u + i, v + i); } for (int i = 0; i < k; ++i) { int city; scanf("%d", &city); int tot = kruskal(city); printf("%d\n", (n - 2) - tot); } return 0; }

浙公网安备 33010602011771号