首页 > 代码库 > X-Plosives

X-Plosives

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 }
View Code

 

X-Plosives