搜索之图的深度优先遍历

题目是书本《啊哈!算法》中的例题,稍加改变的题目如下。


暑假小哼想到小哈家里去玩,小哼和小哈住在不同的城市,并且小哼之前从来没有去过小哈家,这是小哼第一次上门。怎么去呢?小哼便想起了百度地图。百度地图一下子就给出了从小哼家到小哈家的最短行车方案。爱思考的小哼想知道百度地图是如何计算出最短行车方案的。下面就是代码所表示城市的地图。

图片来自《啊哈!算法》
接下来给出输入样例

输入


5 8 1 5
1 2 2
1 5 10
2 3 3
2 5 7
3 1 4
3 4 4
4 5 5
5 3 3
第一行: 5表示五个城市;8表示八种路线;1表示从1城出发;5表示目的地为5城
接下来八行(设为a b c):表示从a城到b城为c公里(不等于b城到a城)


输出

9


接下来就是用代码来实现了,我们很容易想到使用dfs的方法,搜到目的地后更新最小值,直到所有的路径都搜完

完整代码实现前,首先必须提到将这个图用代码实现。
实现方法如下,这里为了方便捋清,将输入代码和它一起整理

//图的代码及输入的实现
for(i=1;i<=10;i++){//假设最多只有10个城市
	for(j=1;j<=10;j++){
		a[i][j]=(i!=j)?0:maxn;//①
	}	
}
scanf("%d%d%d%d",&n,&m,&sx,&sy);
for(i=0;i<n;i++){
	scanf("%d%d%d",&p,&q,&x);
	a[p][q]=x;//②
}
//一些解释
/*①题目中会有些城市到另外城市无路线,所以设定为无穷大,因此先设定一个比较大的maxn,
将每个城市到另一个城市的距离都设置为无穷大,而i=j时,就是自己城市到自己城市,所以
距离为0
②得到新的距离覆盖原来的无穷*/

dfs的思想还是一样的,所以接下来给出完整代码

#include<stdio.h>
#include<string.h>
#define maxn 1000050
int a[12][12];//存放图
int b[12];//判断某城市是否到过
int n,m,sx,sy,min=maxn;
void dfs(int step,int dis){
	int i,j,k;
	if(dis>min) return;
	if(step==sy){
		if(dis<min) min=dis;
		return;
	}
	for(i=1;i<=n;i++){
		if(a[step][i]>0&&a[step][i]<maxn&&b[i]==0){
			b[i]=1;
			dfs(i,dis+a[step][i]);
			b[i]=0;
		}
	}
	return;		
}
int main()
{	
	int p,q,x,i,j;
	for(i=1;i<=10;i++){
  		for(j=1;j<=10;j++){
   			a[i][j]=(i!=j)?maxn:n;
  		} 
 	}
 	scanf("%d%d%d%d",&n,&m,&sx,&sy);
 	for(i=0;i<n;i++){
  		scanf("%d%d%d",&p,&q,&x);
  		a[p][q]=x;
 	}
	dfs(sx,0);
	printf("%d",min);
	return 0;
}

运行程序后,得到答案9。
至此,结束,欢迎指出错误。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值