基于Dijsktra算法的最短路径求解

发布时间: 2018年11月26日 10:14   时间限制: 1000ms   内存限制: 128M

有趣的最短路...火候欠佳,目前还很难快速盲打出来,需继续练习。

描述

一张地图包括n个城市,假设城市间有m条路径(有向图),每条路径的长度已知。给定地图的一个起点城市和终点城市,利用Dijsktra算法求出起点到终点之间的最短路径。

输入

多组数据,每组数据有m+3行。第一行为两个整数n和m,分别代表城市个数n和路径条数m。第二行有n个字符,代表每个城市的名字。第三行到第m+2行每行有两个字符a和b和一个整数d,代表从城市a到城市b有一条距离为d的路。最后一行为两个字符,代表待求最短路径的城市起点和终点。当n和m都等于0时,输入结束。

输出

每组数据输出两行。第一行为一个整数,为从起点到终点之间最短路的长度。第二行为一串字符串,代表该路径。每两个字符之间用空格隔开。

样例输入1

3 3
A B C
A B 1
B C 1
A C 3
A C
6 8
A B C D E F
A F 100
A E 30
A C 10
B C 5
C D 50
E D 20
E F 60
D F 10
A F
0 0
样例输出1

2
A B C
60
A E D F
 #include<iostream>
using namespace std;
#define maxn 200
#define inf 1e9 int n;
char v[maxn];//v[A]==1;
int Hash[maxn];//build char index's hash list <char,int>
int e[maxn][maxn];//direct distance between two point
int dis[maxn];//dis from start
int path[maxn];//path=point which is the passing
int visit[maxn];//1 present has visited void Dijkstra(int x)
{//x is start
int k, min;
for (int i = ; i <= n; i++)
{
dis[i] = e[x][i];
visit[i] = ;//
if (e[x][i]<inf)
path[i] = x;//add new point into path
else
path[i] = -;//this point doesn't inter the path
}
dis[x] = ;//the dis from itself to isself is 0
visit[x] = ;//has visited
for (int t = ; t<n - ; t++)
{
min = inf;
for (int i = ; i <= n; i++)
{
if (!visit[i] && dis[i]<min)//has visited and short dis
{
k = i;
min = dis[i];
}
}
visit[k] = ;//k shortest point
for (int i = ; i <= n; i++)
{
if (!visit[i] && dis[i]>dis[k] + e[k][i])//through k to this point is shorter
{
dis[i] = dis[k] + e[k][i];
path[i] = k;
}
}
}
}
void printpath(int x)
{
if (x != -)
{
printpath(path[x]);
cout<<v[x]<<" ";
}
}
int main()
{
int m, d;
char x, y;
while ()
{
cin>>n>>m;
if (!n&&!m)break;
for (int i = ; i<maxn; i++)
for (int j = ; j<maxn; j++)
e[i][j] = inf;
for (int i = ; i <= n; i++)//from 1
{
cin>>v[i];
Hash[v[i]] = i;//build char index's hash list <char,int>
}
while (m--)
{
cin>>x>>y>>d;
e[Hash[x]][Hash[y]] = e[Hash[y]][Hash[x]] = d;//change to邻接矩阵
}
cin >> x >> y;
Dijkstra(Hash[x]);//input start point..
cout<<dis[Hash[y]]<<endl;//after renew,output dis...
printpath(path[Hash[y]]);//output path
cout<<v[Hash[y]]<<endl;//output last path
}
return ;
}

4003.基于Dijsktra算法的最短路径求解的更多相关文章

  1. 基于Dijsktra算法的最短路径求解

    基于Dijsktra算法的最短路径求解   描述 一张地图包括n个城市,假设城市间有m条路径(有向图),每条路径的长度已知.给定地图的一个起点城市和终点城市,利用Dijsktra算法求出起点到终点之间 ...

  2. AI贪吃蛇前瞻——基于Dijkstra算法的最短路径问题

    在贪吃蛇流程结构优化之后,我又不满足于亲自操刀控制这条蠢蠢的蛇,干脆就让它升级成AI,我来看程序自己玩,哈哈. 一.Dijkstra算法原理 作为一种广为人知的单源最短路径算法,Dijkstra用于求 ...

  3. 【图论】深入理解Dijsktra算法

    1. Dijsktra算法介绍 Dijsktra算法是大牛Dijsktra于1956年提出,用来解决有向图单源最短路径问题.但不能解决负权的有向图,若要解决负权图则需要用到Bellman-Ford算法 ...

  4. Dijsktra算法C++实现

    Dijsktra算法解决了有向图G=(V,E)上带权的单源最短路径问题.但要求所有边的权值非负. 思想:Dijkstra算法中设置了一顶点集合S,从源点s到集合中的顶点的最终最短路径的权值均已确定.算 ...

  5. 『算法设计_伪代码』贪心算法_最短路径Dijkstra算法

    Dijkstra算法实际上是一个贪婪算法(Greedy algorithm).因为该算法总是试图优先访问每一步循环中距离起始点最近的下一个结点.Dijkstra算法的过程如下图所示. 初始化 给定图中 ...

  6. C++迪杰斯特拉算法求最短路径

    一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...

  7. 判断用户输入的银行卡号是否正确--基于Luhn算法的格式校验

    开发中,有时候,为了打造更好的用户体验,同时减轻服务器端的压力,需要对于一些如,手机号码,银行卡号,身份证号码进行格式校验 下面是判断银行卡号输入是否正确的代码(基于Luhn算法的格式校验): iOS ...

  8. #研发解决方案#基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案

    郑昀 基于杨海波的设计文档 创建于2015/8/13 最后更新于2015/8/25 关键词:异常流量.rate limiting.Nginx.Apriori.频繁项集.先验算法.Lua.ELK 本文档 ...

  9. 基于DES算法加密的防撞库密码系统项目总结

    项目内容:基于DES算法加密的防撞库密码系统 小组名:zqhzkzkj 目标:1.对用户输入的8位字符进行DES加密,要求用户输入8位密钥 2.对于不同的网站,不同的用户名生成不同的密码 小组成员:周 ...

随机推荐

  1. 读Linear Algebra -- Gilbert Strang

    转眼间我的学士学位修读生涯已经快要到期了,重读线性代数,一是为了重新理解Algebra的的重要概念以祭奠大一刷过的计算题,二是为了将来的学术工作先打下一点点(薄弱的)基础.数学毫无疑问是指导着的科研方 ...

  2. awk对列求和

    awk 'BEGIN{total=0}{total+=$1}END{print total}' 文件名

  3. 本号讯 | 永不消失的协作“空间站”开课;微软推出微软云Azure文档网站

    8月29日,针对企业常面临的“协同办公”困难,开展以“还有这种操作?永不消失的协作'空间站'”为主题的协同办公培训课. 课程内容包含:在Office 365环境中,如何利用Teams与Groups等功 ...

  4. Linux中gzip、bzip2、zip、unzip、tar使用介绍

    压缩解压缩命令介绍.gz 压缩为gzip文件.bz2 压缩为bzip2文件.tar 打包文件,将多个文件合并成一个目录.tar.gz 先打成tar包,再压缩为gzip文件.tar.bz2 先打成tar ...

  5. LibreOJ #515. 「LibreOJ β Round #2」贪心只能过样例

    题目描述 一共有 nnn个数,第 iii 个数 xix_ix​i​​ 可以取 [ai,bi][a_i , b_i][a​i​​,b​i​​] 中任意值.设 S=∑xi2S = \sum{{x_i}^2 ...

  6. UVA 11987 Almost Union-Find (单点修改的并查集)

    此题最难处理的操作就是将一个单点改变集合,而普通的并查集是不支持这种操作的. 当结点p是叶子结点的时候,直接pa[p] = root(q)是可以的, p没有子结点,这个操作对其它结点不会造成任何影响, ...

  7. 2018.4.27 Java的Swing常用事件

    Swing常用事件 1.Java Swing中处理事件的一般步骤是: (1)新建一个组件(JButton) (2)将该组件添加到面板中(JPanel) (3)注册监听器以监听事件源产生的事件(如Act ...

  8. JS函数的length属性

    length 是函数对象的一个属性值,指该函数有多少个必须要传入的参数,那些已定义了默认值的参数不算在内,比如function(xx = 0)的length是0.. 另外在函数内部:arguments ...

  9. 实验十三 团队作业9:Beta冲刺与团队项目验收

    实验十三 团队作业9:Beta冲刺与团队项目验收 实验时间 2019-6-20(21) Deadline: [6.20-6.26]之间任选连续3天的23:00,以团队随笔博文提交时间为准. 评分标准: ...

  10. javaweb基础(16)_jsp指令

    一.JSP指令简介 JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分. 在JSP 2.0规范中共定义了三个指令: pa ...