题目要求
给定一个具有n个顶点、m条边的无向图G,假设项点的编号为1-n。基于深度优先搜索算法,编写程序
求无向图G连通子图的个数。
输入格式:
第一行两个整数n, m,分别表示图G的顶点数和边的数量。
下面m行的每-行有两个整数a和b,分别表示顶点a和顶点b有一条边相连。
输出格式:
输出一个整数,表示图G中连通子图的数量。
输入样例:
5 3
1 2
1 3
4 5
输出样例:
2
思路
由于图的深度优先遍历算法对n个节点调用之前会判断该节点是否遍历过,如果已遍历就跳过,否则调用DFS算法,所以DFS算法的调用次数就是图中联通子图的个数。
代码实现
#include <stdio.h>
#define MAXNUM 1000
int Group[MAXNUM]; //记录图中节点是否被访问过
int dist[MAXNUM][MAXNUM]; //通过邻接矩阵保存图
void DFS(int i, int n);
int main()
{
int n, m, p, q, k = 0;
for (int i = 0; i < MAXNUM; i++)
{
for (int j = 0; j < MAXNUM; j++)
dist[i][j] = 0; //初始化邻接矩阵,初始值为0
Group[i] = 0; //同上
}
scanf("%d%d", &n, &m); //获取图的节点数n,和边数m
for (int i = 0; i < m; i++)
{
scanf("%d%d", &p, &q);
dist[p-1][q-1] = 1; //如果节点1和节3相连 则另dist[1][3]和dist[3][1]的值为1
dist[q-1][p-1] = 1;
}
for (int i = 0; i < n; i++)
{
if (Group[i] != 1)
{
DFS(i, n);
k++; //执行一次DFS就是k的值自增1,
}
}
printf("%d", k);
system("pause");
return 0;
}
void DFS(int i,int n)
{
Group[i] = 1;
for (int j = 0; j < n; j++)
{
if (dist[i][j] == 1)
if (Group[j] != 1)
DFS(j, n);
}
}