题目是书本《啊哈!算法》中的例题,稍加改变的题目如下。
暑假小哼想到小哈家里去玩,小哼和小哈住在不同的城市,并且小哼之前从来没有去过小哈家,这是小哼第一次上门。怎么去呢?小哼便想起了百度地图。百度地图一下子就给出了从小哼家到小哈家的最短行车方案。爱思考的小哼想知道百度地图是如何计算出最短行车方案的。下面就是代码所表示城市的地图。
接下来给出输入样例
输入
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。
至此,结束,欢迎指出错误。