基于Dijsktra算法的最短路径求解
描述
一张地图包括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>
#include<string>
#include<cstring>
#define MaxInt 32767
#define MVNum 100//最大顶点数
/* 注意是有向图,用邻接矩阵
*/
int D[MVNum];//起点开始到各个点的距离
int S[MVNum];//是否访问过
int Path[MVNum];
using namespace std;
typedef struct
{
char vexs[MVNum];
int arcs[MVNum][MVNum];
int vexnum, arcnum;
}AMGraph;
int Locate(AMGraph &G,char s)//返回编号
{
for (int i = ; i <=G.vexnum; i++)
{
if (G.vexs[i] == s)
return i;
}
}
void Creat(AMGraph &G)
{
for (int i = ; i <= G.vexnum; i++)
{
cin >> G.vexs[i];
}
for(int i=;i<=G.arcnum;i++)
for (int j = ; j <= G.arcnum; j++)
{
G.arcs[i][j] = MaxInt;
}
for (int i = ; i < G.arcnum; i++)
{
char a, b;
int c;
cin >> a >> b >> c;
int h, t;
h = Locate(G, a);
t = Locate(G, b);
G.arcs[h][t] = c;//有向图
}
}
void Dijkstra(AMGraph &G,int v0)
{
int n = G.vexnum;
int v;
for (v = ; v <= n; v++)
{
S[v] = ;
D[v] = G.arcs[v0][v];
if (D[v] <MaxInt)
Path[v] = v0;
else
Path[v] = -;
}
S[v0] = ;
D[v0] = ;
for (int i = ; i < n - ; i++)
{
int min =MaxInt;
int v=;
for (int w = ; w <= n; w++)
{
if (S[w] != && D[w] <=min)
{
v = w;
min = D[w];
}
}
S[v] = ;
for (int w = ; w <= n; w++)
{
if (S[w] != && (D[v] + G.arcs[v][w] < D[w]))
{
D[w] = D[v] + G.arcs[v][w];
Path[w] = v;
}
}
}
}
void Print(AMGraph &G,int s,int e)
{
int r[MVNum];//记录路径的编号
r[] = e;
int i = ;
while (Path[r[i-]]!=-)
{
r[i] = Path[r[i - ]];
i++;
}
for (int j = i - ; j > ; j--)
cout << G.vexs[r[j]] << " ";
cout << G.vexs[r[]] << endl;
}
int main()
{
int n, m;
while (cin >> n >> m)
{
if (n == && m == )
break;
AMGraph G;
G.vexnum = n;
G.arcnum = m;
Creat(G);
char start, end;
cin >> start >> end;
int s, e;
s = Locate(G, start);
e = Locate(G, end);
Dijkstra(G, s);
cout <<D[e]<<endl;
Print(G,s,e);
}
return ;
}
基于Dijsktra算法的最短路径求解的更多相关文章
- 4003.基于Dijsktra算法的最短路径求解
基于Dijsktra算法的最短路径求解 发布时间: 2018年11月26日 10:14 时间限制: 1000ms 内存限制: 128M 有趣的最短路...火候欠佳,目前还很难快速盲打出来,需继 ...
- AI贪吃蛇前瞻——基于Dijkstra算法的最短路径问题
在贪吃蛇流程结构优化之后,我又不满足于亲自操刀控制这条蠢蠢的蛇,干脆就让它升级成AI,我来看程序自己玩,哈哈. 一.Dijkstra算法原理 作为一种广为人知的单源最短路径算法,Dijkstra用于求 ...
- 【图论】深入理解Dijsktra算法
1. Dijsktra算法介绍 Dijsktra算法是大牛Dijsktra于1956年提出,用来解决有向图单源最短路径问题.但不能解决负权的有向图,若要解决负权图则需要用到Bellman-Ford算法 ...
- Dijsktra算法C++实现
Dijsktra算法解决了有向图G=(V,E)上带权的单源最短路径问题.但要求所有边的权值非负. 思想:Dijkstra算法中设置了一顶点集合S,从源点s到集合中的顶点的最终最短路径的权值均已确定.算 ...
- 『算法设计_伪代码』贪心算法_最短路径Dijkstra算法
Dijkstra算法实际上是一个贪婪算法(Greedy algorithm).因为该算法总是试图优先访问每一步循环中距离起始点最近的下一个结点.Dijkstra算法的过程如下图所示. 初始化 给定图中 ...
- C++迪杰斯特拉算法求最短路径
一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...
- 判断用户输入的银行卡号是否正确--基于Luhn算法的格式校验
开发中,有时候,为了打造更好的用户体验,同时减轻服务器端的压力,需要对于一些如,手机号码,银行卡号,身份证号码进行格式校验 下面是判断银行卡号输入是否正确的代码(基于Luhn算法的格式校验): iOS ...
- #研发解决方案#基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案
郑昀 基于杨海波的设计文档 创建于2015/8/13 最后更新于2015/8/25 关键词:异常流量.rate limiting.Nginx.Apriori.频繁项集.先验算法.Lua.ELK 本文档 ...
- 基于DES算法加密的防撞库密码系统项目总结
项目内容:基于DES算法加密的防撞库密码系统 小组名:zqhzkzkj 目标:1.对用户输入的8位字符进行DES加密,要求用户输入8位密钥 2.对于不同的网站,不同的用户名生成不同的密码 小组成员:周 ...
随机推荐
- Python win32api.keybd_event模拟键盘输入
win32api.keybd_event 该函数原型:keybd_event(bVk, bScan, dwFlags, dwExtraInfo) 第一个参数:虚拟键码(键盘键码对照表见附录): 第二个 ...
- [ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.1.1:war
创建springboot项目,且不采用<parent>引入springboot时,pom.xml如下: <?xml version="1.0" encoding= ...
- cf1208 D Restore Permutation (二分+树状数组)
题意 让你构造一个长度为n的序列,记为p1……pn,(这个序列是1~n的全排列的一种) 给你n个数,记为s1……sn,si的值为p1……pi-1中小于pi的数的和. 思路 显然,应该倒着来,也就是从p ...
- [极客大挑战 2019]FinalSQL
0x00 知识点 盲注 0x01 解题 根据题目提示盲注,随便点几下找到注入点 发现我们输入^符号成功跳转页面,证明存在注入 1^(ord(substr((select(group_concat(sc ...
- eclipse上部署到tomcat不能自动部署maven管理的额jar包
- 洛谷 P2196 挖地雷
题目传送门 解题思路: 记忆化搜索,题目比较坑的地方在于,这是个有向图,给的边是单向边!!!!!!!! AC代码: #include<iostream> #include<cstdi ...
- 18 12 18 给服务器添加logging 日志功能
Python中有个logging模块可以完成相关信息的记录,在debug时用它往往事半功倍 1. 日志级别 日志一共分成5个等级,从低到高分别是: DEBUG INFO WARNING ERROR C ...
- SpringCloud学习之手把手教你用IDEA搭建入门项目(一)
SpringCloud简单搭建 jdk:1.8开发工具:IDEA注:需要了解springcloud 1.创建最简单的Maven项目 1)开始创建一个新的项目 2)创建一个空模板的maven项目,用 ...
- Cavace 自定义View绘制
一.开发资料与实例教程1.跟囧猫学之Canvas.Matrix 倒影实例教程 http://www.eoeandroid.com/thread-158506-1-1.html 2.Gridview 控 ...
- aliyun服务器lamp配置
1.安装Apache:yum install httpd 2.安装php: yum install php 3.安装mysql客户端:yum install mysql 4.安装mysql服务端:yu ...