题意: Ignatius生日,他觉得朋友们不认识坐一起很尴尬,想把认识的朋友们安排在同一张桌子,问我们这样需要几张桌子
dfs题解:用二维数组标记互相认识的朋友们,相当于求连通块吧…认识了就互通了,记录使用dfs的次数,用了几次dfs就需要几张桌子。
#include<iostream>
#include<cstring>
using namespace std;
#define maxn 1500
int p[maxn][maxn], q[maxn];
int n, m;//N indicates the number of friends, the friends are marked from 1 to N. Then M lines follow.
void dfs(int x)
{
q[x] = 1;
for (int i = 1; i <= n; i++)
{
if (q[i] == 0)
{
if (p[x][i] == 1)
{
q[i] = 1;
dfs(i);
}
}
}
}
int main()
{
int t;
cin >> t;//例子次数
while (t--)
{
memset(p, 0, sizeof(p));
memset(q, 0, sizeof(q));
cin >> n >> m;
int a, b;//互相认识的两个朋友
for (int i = 1; i <= m; i++)
{
cin >> a >> b;
p[a][b] = p[b][a] = 1;
}
int sum = 0;
for (int i = 1; i <= n; i++)
{
if (q[i] == 0)
{
dfs(i);
sum++;
}
}
cout << sum << endl;
}
}
并查集做法:
#include<cstdio>
#include<iostream>
using namespace std;
int fa[1005];
int n,m;
void init()
{
for(int i=0;i<1005;i++)
fa[i]=i;
}
int findd(int x)
{
if(fa[x]!=x)
fa[x]=findd(fa[x]);
return fa[x];
}
void unionn(int x,int y)
{
int a=findd(x),b=findd(y);
if(a!=b)
fa[b]=a;
else return;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int a,b,cnt=0;
cin>>n>>m;
init();
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
unionn(a,b);
}
for(int i=1;i<=n;i++)
{
findd(i);
if(findd(i)==i)
cnt++;
}
cout<<cnt<<endl;
}
return 0;
}