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 }