基于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.对于不同的网站,不同的用户名生成不同的密码 小组成员:周 ...
随机推荐
- C3P0模板
1.创建c3p0-config.xml配置文件放在src下 <?xml version="1.0" encoding="UTF-8"?> <c ...
- Jenkins-在windows上配置自动化部署(Jenkins+Gitlab+IIS)
Jenkins-在windows上配置自动化部署(Jenkins+Gitlab+IIS) web部署样例 windows服务部署样例 系统备份 在服务器上创建后缀名为.ps1的文件,例:BackUpD ...
- 第42章 AWR报表的使用
第42章 AWR报表的使用exec dbms_gather.gather_table_stats('scott','emp');exec dbms_gather_gather_index_stats( ...
- 实验吧Web-中-让我进去(Hash长度扩展攻击、加盐密码及Linux下hashpump的安装使用)
打开网页,测试开始,注入费老大劲,看了大佬的blog才知道怎么干. bp抓包,观察发现cookie中有个source=0,在repeater中修改为source=1,然go一下,出来了一段源代码. $ ...
- C#构造函数调用其他构造函数
http://blog.csdn.net/dogfish/article/details/6990266 <-- 虏来的地 public class Class1 { public Class ...
- jobs|ps|杀死nohup
方法1:如果没有退出客户端界面,可以先通过 “jobs” 命令查看程序是否在运行,此时只有序号没有PID号:输入命令 “jobs -l” 会显示程序的PID号,然后通过 “kill -9 PID”杀死 ...
- ping内网服务器 新
#!/bin/bash ip="192.168.1."lastip=(200201202210211212220221222) #ip列表 可以继续添加 ps () { ping ...
- grid布局——从入门到放弃
基本知识 CSS grid 布局有两个核心组成部分:wrapper(网格容器,父元素)和items(网格项,子元素). 基本属性 属性 含义 display: grid 网格布局(父元素设置) gri ...
- POJ 3659 再谈树形DP
Cell Phone Network Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5325 Accepted: 188 ...
- 通过实例说明在scrapy中 yield的作用
源https://www.jianshu.com/p/7c1a084853d8 开始前的准备工作: 1.MySQL下载:点我2.python MySQL驱动下载:pymysql(pyMySql,直接用 ...