传送门:https://vjudge.net/problem/51Nod-2901
题意:
把存在关系的人放一桌,不论是间接关系还是直接关系
问最少需要多少桌
思路:
二元关系,不存在边权,我们可以直接用vector来存放这些关系
然后从第一个人开始bfs,标记所有能达到的点
每bfs一次,代表需要新增一个桌子
注意标记过的点就不用再bfs了,因为每次bfs的所有点代表是坐一桌的人
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
int n,m,u,v,vis[maxn],ans;
vector<int> a[maxn];
queue<int> q;
void bfs(int x){
while(!q.empty()) q.pop();
vis[x]=1;
q.push(x);
while(!q.empty()){
int now = q.front();
q.pop();
for(int to:a[now]){
if(!vis[to]){
vis[to]=1;
q.push(to);
}
}
}
}
int main(){
cin>>n>>m;
for(int i=0;i<m;i++){
cin>>u>>v;
a[u].push_back(v);
a[v].push_back(u);
}
for(int i=1;i<=n;i++){
if(!vis[i]){
ans++;
bfs(i);
}
}
cout<<ans<<endl;
}