犯罪团伙 codevs 3554

这是一道经典的水题,提供两种方法:①深搜  ②并查集

NO.1 深度优先搜索:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
bool a[10100],f[10100][10100];
int n,m,x,y;
void dfs(int t)
{
a[t]=1;
for (int i=1;i<=n;i++)
if (a[i]==0 && f[t][i]==1)
dfs(i);
}
int main()
{
cin>>n;
cin>>m;
memset(a,0,sizeof(a));
memset(f,0,sizeof(f));
for (int i=1;i<=m;i++)
{
cin>>x>>y;
f[x][y]=1;
f[y][x]=1;
}
int ans=0;
for (int i=1;i<=n;i++)
if (a[i]==0)
{
ans+=1;
dfs(i);
}
cout<<ans;
}

NO.2 并查集:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m,x,y,t1,t2,f[10010];
int find(int t)
{
if (f[t]!=0)
f[t]=find(f[t]);
else
return t;
return f[t];
}
int main()
{
cin>>n>>m;
memset(f,0,sizeof(f));
for (int i=1;i<=m;i++)
{
cin>>x>>y;
t1=find(x);
t2=find(y);
if (t1!=t2)
f[t2]=t1;
}
int ans=0;
for (int i=1;i<=n;i++)
if (f[i]==0)
ans+=1;
cout<<ans;
}

原文地址:https://www.cnblogs.com/xiaoqi7/p/5308453.html