Aizu - 2564 Tree Reconstruction 并查集

 Aizu - 2564 Tree Reconstruction

题意:一个有向图,要使得能确定每一条边的权值,要求是每个点的入权和出权相等,问你最少需要确定多少条边

思路:这题好像有一个定理之类的,对于每一个连通块,所需要的边数是 M-N(边数-点数) ,这个原理我还不是很清楚。

  知道了这个之后,并查集求一下就完事了。

这题我大致看了一下官方 的提交记录,发现有好多种方法可以搞。23:48:40

 1 #pragma comment(linker, "/STACK:1000000000")
 2 #include <bits/stdc++.h>
 3 #define LL long long
 4 #define INF 0x3f3f3f3f
 5 #define IN freopen("in.txt","r",stdin);
 6 using namespace std;
 7 #define MAXN 505
 8 vector<int> G[MAXN];
 9 queue<int> Q;
10 int father[MAXN];
11 int find(int x){
12     if(father[x] == x) return x;
13     father[x] = find(father[x]);
14     return father[x];
15 }
16 int main(void)
17 {
18     //IN;
19     int n, m;
20     scanf("%d%d", &n, &m);
21     for(int i = 1; i <= n; i++){
22         father[i] = i;
23     }
24     int x, y;
25     for(int i = 1; i <= m; i++){
26         scanf("%d%d", &x, &y);
27         x = find(x);
28         y = find(y);
29         if(x != y){
30             father[x] = y;
31         }
32     }
33     int ans = m - n;
34     for(int i = 1; i <= n; i++){
35         if(father[i] == i){
36            ans++;
37         }
38     }
39     printf("%d\n", ans);
40 }

 

posted on 2015-08-22 23:49  张济  阅读(171)  评论(0编辑  收藏  举报

导航