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

 

posted @ 2015-07-30 21:50  ACSeed  Views(180)  Comments(0)    收藏  举报