图的深度优先遍历
如果有用的话,请点个赞哦👑
-
问题描述
已知无向图的邻接矩阵,以该矩阵为基础,给出深度优先搜索遍历序列,并且给出该无向图的连通分量的个数。在遍历时,当有多个点可选时,优先选择编号小的顶点。(即从顶点1开始进行遍历)
-
输入格式
第一行是1个正整数,为顶点个数n(n<100),顶点编号依次为1,2,…,n。后面是邻接矩阵,n行n列。
-
输出格式
共2行。第一行输出为无向图的深度优先搜索遍历序列,输出为顶点编号,顶点编号之间用空格隔开;第二行为无向图的连通分量的个数。
-
样例输入
6
0 1 0 0 0 0
1 0 0 0 1 0
0 0 0 1 0 0
0 0 1 0 0 0
0 1 0 0 0 1
0 0 0 0 1 0 -
样例输入
1 2 5 6 3 4
2 -
解题思路
建立visit数组来区分结点是否已被访问,如果没有被访问,则访问他,修改visit,如果此节点存在邻接节点,递归访问此节点的下一个邻接节点;如果不存在邻接节点,说明此节点所在的连通分量已经被访问完,接下来按顺序判断下面的节点,并对为访问过的节点进行访问,直到所有的节点都被访问完。
-
完整代码
#include<stdio.h>
int visit[100],n;
int vexnum[100][100];
void DFS(int i)
{
visit[i]=1;//访问过了
printf("%d ",i+1);//输出节点
for(int j=1;j<n;j++)//对i尚未访问过的邻接结点调用DFS
if(visit[j]==0&&vexnum[i][j]!=0)
DFS(j);
}
int main()
{
int i,j,count;
count=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
scanf("%d",&vexnum[i][j]);//邻接矩阵初始化
visit[i]=0;//访问标志数组初始化
}
for(i=0;i<n;i++)//将结点遍历一遍,遇到没有被访问过的结点,则访问它
if(!visit[i])//没有被访问过
{
/*从一个节点开始访问后,会访问到他所在连通分支的所有结点*/
DFS(i);//访问,当这个语句执行完,一个连通分支已经被访问完了
count++;//连通分量个数加一
}
printf("\n");
printf("%d",count);
return 0;
}