https://vjudge.net/problem/UVALive-3644
题意:
有若干个由两种元素组成的简单化合物,现在把它们装进车里,如果车上有恰好有k种简单化合物并且恰好有k种元素的话,那么就会引发爆炸,所以车上的化合物必须避免满足这个条件。
现在用一个整数表示元素,每行两个整数表示一个简单化合物,按顺序给出,求出这些化合物中有多少个化合物不能装进车。
思路:
如果元素表示点,那么化合物就表示边,要爆炸的条件就是形成环,即为k个点k条边,那么就肯定存在环。直接用并查集判断就好了。
代码:
1 #include <stdio.h> 2 #include <string.h> 3 4 int par[100005]; 5 6 void init(int n) 7 { 8 for (int i = 0; i <= n; i++) par[i] = i; 9 } 10 11 int fin(int x) 12 { 13 if (x == par[x]) return x; 14 else return par[x] = fin(par[x]); 15 } 16 17 bool unit(int x,int y) 18 { 19 x = fin(x); 20 y = fin(y); 21 22 if (x == y) return 0; 23 24 par[x] = y; 25 26 return 1; 27 } 28 29 int main() 30 { 31 int a,b; 32 33 while (scanf("%d",&a) != EOF) 34 { 35 init(100000); 36 37 scanf("%d",&b); 38 39 unit(a,b); 40 41 int ans = 0; 42 43 for (;;) 44 { 45 scanf("%d",&a); 46 47 if (a == -1) break; 48 49 scanf("%d",&b); 50 51 if (!unit(a,b)) 52 { 53 ans++; 54 } 55 } 56 57 printf("%d ",ans); 58 } 59 60 return 0; 61 }