下周日就是Bob的生日了,他邀请了自己的朋友来参加生日晚宴,但他的朋友们并不一定都互相认识,这也使得他们可能不愿意在同一张桌子上共进晚餐。
两个人A,B愿意在同一张桌子共进晚餐的前提是: 要么A,B认识、要么A,B都愿意和另外一个Bob的朋友C共进晚餐
现在告诉你Bob的n位朋友及他们之间m对认识关系,请你告诉Bob至少要准备多少张桌子给这些朋友才行。
Input
第一行两个整数n,m,表示Bob有n个朋友,他们之间有m对朋友互相认识 接下来m行,每行两个整数x,y,表示第x个朋友和第y个朋友互相认识
Output
一行一个整数表示最少要准备的桌子数
Sample Input
输入样例1:
5 4
1 2
2 3
3 4
4 5
输入样例2:
5 4
1 2
2 3
1 3
4 5
输入样例3:
5 2
1 2
3 4
Sample Output
输出样例1:
1
输出样例2:
2
输出样例3:
3
解析:
将每个关系利用线和结点表示出来,可发现就是一个图的问题
BFS的次数就是所求桌子数
answer:
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int maxn=1e6+10;
vector<int> v[maxn];
int vis[maxn];
int sum=0;
void bfs(int x)
{
queue<int>q;
q.push(x);
while(!q.empty())
{
int temp=q.front();
q.pop();
for(int t:v[temp])
{
if(vis[t]==0){
vis[t]=1;
q.push(t);
}
}
}
}
int main()
{
int n,m;
cin>>n>>m;
memset(vis,0,sizeof(vis));
int a,b;
for(int i=0;i<m;i++)
{
cin>>a>>b;
v[a].push_back(b);
v[b].push_back(a);
}
for(int i=1;i<=n;i++)
{
if(vis[i]==0)
{
bfs(i);
sum++;
}
}
cout<<sum<<endl;
}