基于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. php 判断字符串中是否包含另一个字符串 strpos

    strpos (PHP 4, PHP 5, PHP 7) strpos — 查找字符串首次出现的位置 说明 strpos ( string $haystack ,  $needle [, int $o ...

  2. uvm_reg_file——寄存器模型(十四)

    有了uvm_reg_field, uvm_reg, uvm_block, 也许我们需要跟大的uvm_file,这就是传说中的寄存器堆. // // CLASS: uvm_reg_file // Reg ...

  3. UVA 10954 Add All 全部相加 (Huffman编码)

    题意:给你n个数的集合,每次选两个删除,把它们的和放回集合,直到集合的数只剩下一个,每次操作的开销是那两个数的和,求最小开销. Huffman编码.Huffman编码对于着一颗二叉树,这里的数对应着单 ...

  4. self & this 上下文

    对象:指向对象的首地址: 函数:代表了函数运行的主要上下文: 内部:在类的内部使用. self Within the body of a class method, self refers to th ...

  5. 剑指offer55 字符流中第一个不重复的字符(最典型错误)

    典型并且基础的错误: class Solution { public: //Insert one char from stringstream void Insert(char ch) { ) res ...

  6. 查询linux文件的MD5值

    Linux下查询文件的MD5值:md5sum xxx.iso.md5 MD5算法常常被用来验证网络文件传输的完整性,防止文件被人篡改.MD5全称是报文摘要算法(Message-Digest Algor ...

  7. WINDOWS-基础:Thread.Sleep(0)

    我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间.那么你有没有正确的理解这个函数的用法呢?思考下面这两个问题: 假设现在是 2008-4-7 12:00:00.000,如果我调用 ...

  8. jq 下拉框

    <div class="alls"> <div class="item"> <div class="all"& ...

  9. vue 点击下拉框

    data: { hide:false, zhi:"全部" }, <div class="item"> <div class="c2c ...

  10. javascript (六)DOM

    学习后的总结: DOM:document object model 关于DOM的简介:http://www.w3school.com.cn/htmldom/dom_intro.asp 本文说的是HTM ...