//整体思路是利用队列进行操作,BFS主要用于求图或迷宫的最短路径
//若要求全部解,则需要利用DFS
#include<iostream>
#include<queue>
#include<algorithm>
#include<vector>
using namespace std;
//利用bfs检测图的连通性 //利用邻接表存储图 //不带权值
const int maxn=100;
int N;
vector<int > map[maxn];
bool inq[maxn]={false};
//int map[maxn][maxn];
int ans;
void bfs(int u)
{
queue<int >q;
q.push(u);
inq[u]=true;
while(!q.empty())//当q中为空时,说明已经访问完了一个连通块。此时又重新进入bfs_travel访问下一个连通块
{
int v=q.front();
q.pop();
for(int i=0;i<map[v].size();i++)
{
int m=map[v][i];
if(inq[m]==false)
{
q.push(m);
inq[m]=true;
}
}
}
}
void bfs_travel()
{
for(int i=0;i<N;i++)
{
if(inq[i]==false)
{
bfs(i);
ans++;
}
}
}
int main()
{
int M;
cin>>N>>M;//N:the numbers of the node ,M:the numbers of the edge
int a,b;
for(int j=0;j<M;j++)
{
cin>>a>>b;
map[b].push_back(a);
map[a].push_back(b);//无向图,两边都要存储
}
bfs_travel();
cout<<ans<<endl; //连通块的总数
return 0;
}
输入:
5 4
0 1
1 2
3 4
0 2
输出:
2