并查集详细分析:http://blog.sina.com.cn/s/blog_87cb8e680100skd7.html
/*
主要是两个函数find 和 join.
本题大意,一些物品装车,来一件物品就要判断,
是否与已经装车的物品时联通的,联通不要,不连通装车,并且并到里面
*/
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int inf = 100010,pre[100010],num;
int find(int x)
{
return pre[x] != x? pre[x] = find(pre[x]):x;
}
int join(int x,int y)
{
x = find(x), y = find(y);
if(x == y) num++;
else pre[x] = y;
}
int main()
{
int x,y,i;
while(cin>>x)
{
num = 0;
for(i = 0; i < inf; i++)
pre[i] = i;
while(x != -1)
{
cin>>y;
join(x,y);
cin>>x;
}
cout<<num<<endl;
}
return 0;
}