深度优先搜索,广度优先搜索

深度优先搜索:

#include<stdio.h>
int book[101],sum,n,e[101][101] ;
void dfs(int cur)
{
	printf("%d ",cur) ;
	sum++ ;    //每访问一个顶点,sum就加一 
	if(sum==n)
		return ;//所有的顶点都已经访问过则直接退出
	for(int i=1;i<=n;i++)//从一号顶点到 n 号顶点一次尝试,
						//看那些顶点与当前顶点cur有边相连 
	{
		//判断当前顶点cur到顶点i是否有边,
		//并判断顶点i是否已访问过
		if(e[cur][i]==1&&book[i]==0)
		{
			book[i] = 1 ;
			dfs(i) ;
		 } 
	} 
	return ;
}
int main()
{
	int m,a,b ;
	scanf("%d %d",&n,&m) ;
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<=n;j++)
		{
			if(i==j)
				e[i][j] = 0 ;
			else
				e[i][j] = 99999999 ;//设99999999为正无穷 
		}
	}
	//读入顶点之间的边
	for(int i=1;i<=m;i++)
	{
		scanf("%d %d",&a,&b) ;
		e[a][b] = 1 ;
		e[b][a] = 1 ;
	} 
	//从1号顶点出发
	book[1] = 1 ;//标记1号顶点已访问 
	dfs(1) ; //从一号顶点开始遍历 
	return 0 ;	
} 

广度优先搜索

#include<stdio.h>
int main()
{
	int n,m,cur ;
	int book[101] = {0} ;
	int e[101][101] ;
	int que[10001],head,tail ;
	scanf("%d %d",&n,&m) ;
	//初始化二维矩阵
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<n;j++)
		{
			if(i==j)
				e[i][j] = 0 ;
			else
				e[i][j] = 99999999 ; //设999999999为正无穷 
		 } 
	} 
	int a ;
	int b ;
	//读入顶点之间的边
	for(int i=1;i<=m;i++)
	{
		scanf("%d %d",&a,&b) ;
		e[a][b] = 1 ;
		e[b][a] = 1 ;//无向图 
	} 
	//队列初始化
	head = 1 ;
	tail = 1 ;
	
	//从一号顶点出发,将一号顶点加入队列
	que[tail] = 1 ;
	tail++ ;
	book[1] = 1 ; //标记1号顶点已访问
	
	//当队列不为空的时候循环
	while(head<tail&&tail<=n)
	{
		cur = que[head] ;//当前正在访问的顶点编号 
		for(int i=1;i<=n;i++)//从1-n一次尝试 
		{
			//判断从顶点cur到顶点1是否有边,并判断顶点i是否已经访问过
			if(e[cur][i]==1&&book[i]==0)
			{
				//如果顶点cur到顶点i有边,并且顶点i没有被访问过,则将顶点i入队
				que[tail] = i ;
				tail++ ;
				book[i] = 1 ; 
			}
			//如果tail大于 n ,则表明所有顶点都已经被访问过
			if(tail>n)
				break  ; 
		} 
		head ++ ;//注意这个地方,千万不要忘记一个顶点扩展结束后,head++,然后
				 //才能继续往下扩展 
	}
	for(int i=1;i<tail;i++)
		printf("%d ",que[i]) ;
	return 0 ;
 } 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值