基于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算法的最短路径求解的更多相关文章

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

    基于Dijsktra算法的最短路径求解 发布时间: 2018年11月26日 10:14   时间限制: 1000ms   内存限制: 128M 有趣的最短路...火候欠佳,目前还很难快速盲打出来,需继 ...

  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. 【每日Scrum】第十天冲刺

    一.计划会议内容 尝试整合代码 二.任务看板 任务看板 已完成:登录与个人界面布局实现,UI设计美化,地图主界面 进行中:功能整合, 待进行:连接数据库 三.scrum讨论照片 四.产品的状态 无 五 ...

  2. 标准JAVA工程结构

  3. (排序)P1177 【模板】快速排序

    题解: 这道题用传统快排(如下所示)的结果就是最后三个点TLE: 如果永远取第一个元素作为枢轴的话,在数组已经有序的情况下每次划分都将得到最坏的结果,时间复杂度退化为O(n^2).因为其中一个子序列每 ...

  4. 微信小程序之组件常见的问题

    小程序自定义的组件: (1)组件的结构 自定义的组件和普通的页面定义没有什么区别,也包含了四个文件:xxx.wxml(组件的视图层),xxx.json,xxx.js,xxx.wxss 组件的xxx.w ...

  5. Restful设计相关

    1.get,从服务器获取资源. 2.post 新增资源. 3.put 更新完整资源. 4.patch 更新部分资源. 5. delete 删除资源.

  6. 2019年阿里java面试题

    一.JVM与性能优化 描述一下 JVM 加载 Class 文件的原理机制? 什么是类加载器? 类加载器有哪些? 什么是tomcat类加载机制? 类加载器双亲委派模型机制? Java 内存分配? Jav ...

  7. UML-什么是GRASP?

    1.定义 GRASP:General Responsibility Assignment Software Pattern,即通用职责分配软件模式,使用职责进行OO设计的学习工具. 2.本书目标 1) ...

  8. Linux-线程同步之互斥锁

    1.互斥锁又叫互斥量(mutex) 2.相关函数:pthread_mutex_init  pthread_mutex_destroy   pthread_mutex_lock pthread_mute ...

  9. Springboot项目绑定域名,使用Nginx配置Https

    一.https 简介     HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HT ...

  10. mysql 基本知识 以及优化

    msql的索引应用 1.hash索引  等于值比较时 2.tree索引  范围比较 like '%%'