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 ",refusal); 24 } 25 return 0; 26 }