题意:给出n个哨塔,m面墙。被墙围起来的土地可以分给一个人。问一共可以分给多少人土地。
这题的求的是图中环的个数。用并查集来做,读入两个点,当这两个点的父节点相同说明这两个点已经连通,这时候再加上这条边就形成了一个环。以此来统计环的个数。
#include <iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int ans,pre[1100];
int findset(int v)
{
int t1,t2=v;
while(v!=pre[v]) v=pre[v];
while(pre[t2]!=v)
{
t1=pre[t2];
pre[t2]=v;
t2=t1;
}
return v;
}
void unions(int u,int v)
{
int t1=findset(u);
int t2=findset(v);
if(t1==t2) ans++;
else pre[t1]=t2;
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
for(int i=0;i<n;i++) pre[i]=i;
ans=0;
for(int i=0;i<m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
unions(u,v);
}
cout<<ans<<endl;
}
}