題目:有n個由兩種元素組成的化合物要裝車,如果其中能取出一個子集元素的個數等於化合物的個數,則危險;
現在依次將化合物裝車,遇到危險就放棄(這個化合物不裝車),問有多少元素不裝車。
分析:模擬,圖論,并查集。按照題目順序模擬裝車順序。
如果把每個化合物看成一條邊,每種元素看成一個節點,那麼問題就是判斷環;
如果并查集檢查到來個元素屬於同一個集合,則這條邊的加入就會產生一個環。
說明:╮(╯▽╰)╭。
#include <stdio.h>
//union_set_begin
int sets[100001];
int rank[100001];
void union_set(int l, int r)
{
for (int i = l; i <= r; ++ i) {
rank[i] = 0;
sets[i] = i;
}
}
int union_find(int a)
{
if (a != sets[a])
sets[a] = union_find(sets[a]);
return sets[a];
}
int union_union(int a, int b)
{
if (rank[a] > rank[b])
sets[b] = a;
else {
sets[a] = b;
if (rank[a] == rank[b])
rank[b] ++;
}
}
//union_set_end
int main()
{
int a, b;
while (~scanf("%d",&a)) {
int count = 0;
union_set(0, 100000);
while (a != -1) {
scanf("%d",&b);
a = union_find(a);
b = union_find(b);
if (a == b)
count ++;
else union_union(a, b);
scanf("%d",&a);
}
printf("%d\n",count);
}
return 0;
}