【暑假】[实用数据结构]UVAlive 3644 X-Plosives

UVAlive X-Plosives

 

思路:

   “如果车上存在k个简单化合物,正好包含k种元素,那么他们将组成一个易爆的混合物”  如果将(a,b)看作一条边那么题意就是不能出现环,很容易联想到Kruskal算法中并查集的判环功能(新加入的边必须属于不同的两个集合否则出现环),因此本题可以用并查集实现。模拟装车过程即可。

 

代码:

 

 1 #include<cstdio>
 2 #include<cstring>
 3 #define FOR(a,b,c) for(int a=(b);a<(c);a++)
 4 using namespace std;
 5 const int maxn= 100000 +10;
 6 
 7 int p[maxn];
 8 int find_set(int u){ //寻找root+路径压缩
 9     return u==p[u]? u : p[u]=find_set(p[u]);
10 }
11 int main(){
12 int x,y,refusal;
13   while(scanf("%d",&x)==1){
14       refusal=0;   //直接用变量统计
15       FOR(i,0,maxn) p[i]=i;
16       while(x != -1){
17           scanf("%d",&y);
18           int xr=find_set(x),yr=find_set(y);
19           if(xr == yr) refusal ++;
20           else p[xr]=yr;
21           scanf("%d",&x);
22       }
23       printf("%d\n",refusal);
24   }
25   return 0;
26 }

 

你可能感兴趣的:(【暑假】[实用数据结构]UVAlive 3644 X-Plosives)