题目大意:给你若干个点与点之间的连线,要求这两个点不属于同一个并查集(因为要保证不形成环) 问从上到下依次加入的时候,有多少条边是不满足要求的.
很显然,这是一道并查集的水题.只要保证相连的两个点不在同一并查集就可以了.
但是这道题的输入有点奇怪,多组数据,并且每组数据以-1结尾.输入的部分,参考了 wall_F的博客.
代码如下:
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include<vector>
using namespace std;
int fa[111111];
int find(int x)
{
if(x==fa[x])return x;
return fa[x]=find(fa[x]);
}
void init()
{
for(int i=0;i<=100009;i++)
fa[i]=i;
}
int main()
{
int n,m,i,j,x,y;
while(scanf("%d",&n)!=-1)
{
init();
int ans=0;
while(n!=-1)
{
scanf("%d",&m);
x=find(n);
y=find(m);
if(x!=y)
{
fa[x]=y;
}
else ans++;
scanf("%d",&n);
}
printf("%d\n",ans);
}
return 0;
}