参考博客:
https://blog.csdn.net/jinzk123/article/details/52231527
https://blog.csdn.net/qq_40998706/article/details/86697221
一 . DFS+标记
(求连通分量个数)
题目描述 在无向图中,如果从顶点vi到顶点vj有路径,则称vi和vj连通。如果图中任意两个顶点之间都连通,则称该图为连通图, 否则,称该图为非连通图,则其中的极大连通子图称为连通分量,这里所谓的极大是指子图中包含的顶点个数极大。 例如:一个无向图有5个顶点,1-3-5是连通的,2是连通的,4是连通的,则这个无向图有3个连通分量。
输入 第一行是一个整数T,表示有T组测试样例(0 < T <= 50)。每个测试样例开始一行包括两个整数N,M,(0 < N <= 20,0 <= M <= 200) 分别代表N个顶点,和M条边。下面的M行,每行有两个整数u,v,顶点u和顶点v相连。
输出 每行一个整数,连通分量个数。 示例输入
2 3 1 1 2 3 2 3 2 1 2
示例输出
2 1
#include
#include
#include
int mp[100][100]; //此处当稀疏图处理,建立邻接矩阵
int vis[100];
//传入起点和所有点的个数
void dfs(int x,int n) //dfs搜索,每搜索到一个点处标记已经遍历过,继续dfs直到无点可连
{ //最终所有与x有路相连的点都被遍历到并标记
vis[x]=1;
for(int i=1;i<=n;i++)
{
if(!vis[i]&&mp[x][i]) //没有遍历过该点(v)并且两点(u-v)间有路相连(无向图)
{
dfs(i,n);