博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1030 Travel Plan
阅读量:6533 次
发布时间:2019-06-24

本文共 2267 字,大约阅读时间需要 7 分钟。

hot3.png

ref:

1: 

for(int i = 0; i < n; i++){int minDis = INF;	//在当前未访问的点中,找到starting点的最小距离int closest;	//在当前未访问的点中,找距离starting最近的点,即dist[closest][starting] = minDis

2:

if(vis[j] == 0){//以closest点为媒介,更新各个点到starting的dis和cos

注意在每次更新时,把这个媒介点记录下来了:

path[j] = closest;//从starting到j点的倒数第二个点是closest

3:

使用:

#define N 500#define INF 100000000

#include 
 #define N 500#define INF 100000000int dist[N][N], cost[N][N];int vis[N];//visited int dis[N],cos[N]; //从starting到各个点的最小dist和最小costint path[N]; //从starting到各个点最短路径中的倒数第二个点 //从path[destination]依次回溯直到sourceint stack[1000]; //模拟栈进行路径输出int main(){ freopen("in.txt","r",stdin); int n, m, s, d; scanf("%d%d%d%d",&n,&m,&s,&d); for(int i = 0; i < n; i++){//初始化 for(int j = 0; j < n; j++){ dist[i][j] = dist[j][i] = INF; cost[i][j] = cost[j][i] = INF; } } for(int i = 0; i < m; i++){//暂不考虑重边 int a,b; scanf("%d%d",&a, &b); int tmpDis,tmpCost; scanf("%d", &tmpDis ); scanf("%d", &tmpCost); dist[a][b] = dist[b][a] = tmpDis; cost[a][b] = cost[b][a] = tmpCost; } for(int i = 0; i < n; i++){ dis[i] = dist[s][i]; cos[i] = cost[s][i]; vis[i] = 0; if(dis[i] < INF){//从starting到该点存在直接路径 path[i] = s; }else{ path[i] = -1; } } vis[s] = 1;//初始化起点 path[s] = -1; for(int i = 0; i < n; i++){ int minDis = INF; //在当前未访问的点中,找到starting点的最小距离 int closest; //在当前未访问的点中,找距离starting最近的点,即dist[closest][starting] = minDis for(int j = 0; j < n; j++){ if(vis[j] == 0 && dis[j] < minDis){ minDis = dis[j]; closest = j; } } if(closest == d){//如果恰巧closest就是destination,那就破案了 break; } vis[closest] = 1;//访问了closest点 for(int j = 0; j < n; j++){ if(vis[j] == 0){//以closest点为媒介,更新各个点到starting的dis和cos if( (dis[j] > dis[closest] + dist[closest][j]) || //距离短了 (dis[j] == dis[closest] + dist[closest][j] && cos[j] > cos[closest] + cost[closest][j] //cost少了 )){ dis[j] = dis[closest] + dist[closest][j]; cos[j] = cos[closest] + cost[closest][j]; path[j] = closest;//从starting到j点的倒数第二个点是closest } } } } int tmp = d; int top = 0; while( path[tmp] != -1){ stack[top++] = path[tmp]; tmp = path[tmp]; } for(int i = top-1; i >= 0; i--){ printf("%d ",stack[i]); } printf("%d ",d); printf("%d %d",dis[d], cos[d]); return 0;}

转载于:https://my.oschina.net/kaneiqi/blog/303325

你可能感兴趣的文章
Springmvc的跳转方式
查看>>
加密原理介绍,代码实现DES、AES、RSA、Base64、MD5
查看>>
LINUX中常用操作命令
查看>>
python 获取进程pid号
查看>>
链表中插入一个节点的三种情况
查看>>
洛谷.4180.[模板]次小生成树Tree(Kruskal LCA 倍增)
查看>>
TCL函数“参数自动补全” 与 “help 信息显示”
查看>>
POJ1050To the Max
查看>>
汇编基础--标识符、标号、伪指令和指令
查看>>
Linux软中断、tasklet和工作队列
查看>>
如何解决ORA-28002 the password will expire within 7 days问题(密码快过期)
查看>>
Asp.Net Core 轻松学-利用日志监视进行服务遥测
查看>>
LightSwitch社区资源搜集
查看>>
Android通讯录查询篇--ContactsContract.Data 二(续)
查看>>
IT人的自我导向型学习:开篇杂谈
查看>>
[原创]BizTalk动手实验系列目录
查看>>
HDU 4611Balls Rearrangement(思维)
查看>>
[LeetCode] Majority Element II
查看>>
minGW, cygwin, GnuWin32【C++的跨平台交叉编译问题】
查看>>
我的Dll(动态链接库)学习笔记(转)
查看>>