LQ0151 最短路Dijkstra算法
Posted 海岛Blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LQ0151 最短路Dijkstra算法相关的知识,希望对你有一定的参考价值。
题目来源:蓝桥杯2019初赛 C++ G组H题
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
问题分析
最短路的模板题,用Dijkstra算法来解决,套模板就可以了。
AC的C++语言程序如下:
/* LQ0151 最短路 */
#include <iostream>
#include <cstring>
using namespace std;
const int M = 37;
struct Edge
char u, v;
int w;
e[] =
'A','B',2,
'A','C',1,
'A','D',1,
'A','E',1,
'B','J',2,
'B','G',1,
'C','D',3,
'C','F',3,
'C','G',3,
'D','E',1,
'D','G',2,
'D','H',1,
'D','I',2,
'E','H',1,
'E','I',3,
'F','G',1,
'F','J',1,
'G','F',1,
'G','I',3,
'G','K',2,
'H','I',1,
'H','L',2,
'I','M',3,
'J','S',2,
'K','N',1,
'K','L',3,
'K','P',2,
'L','M',1,
'L','R',1,
'M','N',2,
'M','Q',1,
'M','S',1,
'N','P',1,
'O','P',1,
'O','Q',1,
'O','R',3,
'R','S',1,
;
/* Dijkstra算法
* 复杂度:O(N×N)
* 输入:n 全局变量,图结点数
* g 全局变量,邻接矩阵,g[i][j]表示结点i到j间的边距离
* 输出:dis 全局变量,dis[i]表示结点1到i的最短距离
*/
const int INF = 0x3f3f3f3f;
const int N = 19;
int dis[N + 1], g[N + 1][N + 1], n, vis[N + 1];
void dijkstra()
memset(dis, INF, sizeof dis);
memset(vis, 0, sizeof vis);
dis[1] = 0;
for(int i = 1; i <= n; i++)
int mark = -1, mindis = INF;
for(int j = 1; j <= n; j++)
if(!vis[j] && dis[j] < mindis)
mindis = dis[j], mark = j;
vis[mark] = 1;
for(int j = 1; j <= n; j++)
if(!vis[j])
dis[j] = min(dis[j], dis[mark] + g[mark][j]);
void addEdge(char a, char b, int w)
int u = a - 'A' + 1;
int v = b - 'A' + 1;
g[u][v] = g[v][u] = w;
int main()
n = N;
memset(g, INF, sizeof g);
for(int i = 0; i <= n; i++)
g[i][i] = 0;
for (int i = 0; i < M; i++)
addEdge(e[i].u, e[i].v, e[i].w);
dijkstra();
cout << dis[n] << endl;
return 0;
以上是关于LQ0151 最短路Dijkstra算法的主要内容,如果未能解决你的问题,请参考以下文章