325 图的深度优先遍历 c语言

图的深度优先遍历

 如果有用的话,请点个赞哦👑
  • 问题描述

    已知无向图的邻接矩阵,以该矩阵为基础,给出深度优先搜索遍历序列,并且给出该无向图的连通分量的个数。在遍历时,当有多个点可选时,优先选择编号小的顶点。(即从顶点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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一——一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值