标签:
uvaLive 3644:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1645
题意::每个化合物都是有两种元素组成的,如果车上存在k个简单化合物时,如果它和已装车的化合物形成易燃物的话,你就应该拒绝装车,否则装车,输出没有装车的个数
题解:一开始以为是与车上所有的化合物,所以直接用数组模拟打了一发。后来发现,是只要和部分化合物在一起,如果满足易暴就不行。白书上是用并查集。发现,这样的转化思想很巧妙。化合物作为一条边连接两个点,然后只要判断所有的连通分量中是否出现环就可以了,直接用并查集判断环。并查集有很多的作用。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 const int MAXN = 100005; 7 8 int f[MAXN]; 9 10 int find(int x){ 11 if (x != f[x]) 12 f[x] = find(f[x]); 13 return f[x]; 14 } 15 16 int main(){ 17 int x,y; 18 while (scanf("%d",&x) != EOF){ 19 for (int i = 0; i < MAXN; i++) 20 f[i] = i; 21 int ans = 0; 22 while (x != -1){ 23 scanf("%d",&y); 24 int fx = find(x),fy = find(y); 25 if (fx == fy) 26 ans++; 27 else f[fx] = fy; 28 scanf("%d",&x); 29 } 30 printf("%d\n",ans); 31 } 32 return 0; 33 }
标签:
原文地址:http://www.cnblogs.com/chujian123/p/3870411.html