元素看成顶点,化合物看成一条边。用并查集维护图的联通分量。对于每个新增的化合物(x, y),如果x和y在同一个联通分量里,则加入边(x,y)使得联通分量形成环,从而危险。
代码如下:
1 #include <cstdio> 2 const int maxn=1e6; 3 int pa[maxn]; 4 int find(int x){return pa[x] != x ? pa[x]=find(pa[x]) : pa[x];} 5 int main(){ 6 int x, y; 7 while(scanf("%d",&x)==1){ 8 for(int i=0;i<maxn;i++){pa[i] = i;} 9 int refusals = 0; 10 while (x != -1){ 11 scanf("%d",&y); 12 x = find(x);y = find(y); 13 if (x==y) refusals++;//x and y have been in the same compent, then adding(x,y) will cause a cycle 14 else pa[x] = y; 15 scanf("%d",&x); 16 } 17 printf("%d\n",refusals); 18 } 19 return 0; 20 }