HDU-2544 最短路 Dijkstra模板题
题目链接:https://vjudge.net/problem/HDU-2544
题意:
题目要求找到节点1到节点n之间的一条最短路
分析:
Dijkstra模板题
单源最短路径,可以用dijkstra(当然Floyd或者其他也可以),首先初始化节点间距离数组map和访问记录数组vis,然后录入并存储当前已知点间距离,再使用dijsktra算法以起始点为中心向外层层扩展(广度优先搜索思想),不断更新最短距离,直到扩展到终点为止。最后得到的dis[n]即为起点1至终点n的最短距离。
代码如下:
#include <cstdio> #include<iostream> #include <cstring> #include <cmath> #include <algorithm> #define INF 0x3f3f3f3f using namespace std; typedef long long ll; const int maxn = 1010; int map[maxn][maxn], dis[maxn]; bool vis[maxn]; int n, m; void init() { for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { if(i == j) map[i][j] = 0; else map[i][j] = INF; } } memset(vis, 0, sizeof(vis)); } void dijkstra() { for(int i = 1; i <= n; i++) { dis[i] = map[1][i]; //dis表示起点1至点i的当前最短路径,初始为map[1][i] } for(int i = 1; i <= n-1; i++) { int min = INF, p; for(int j = 1; j <= n; j++) { //在此循环中找到与1距离最短的节点 if(vis[j] == 0 && dis[j] < min) { //如果点j没有访问过,且1->j距离最短 min = dis[j]; //更新当前最短距离 p = j; //更新最短距离节点 } } vis[p] = 1; //标记p已被访问 for(int j = 1; j <= n; j++) { //在此循环中根据之前找到的最短距离点 if(vis[j] == 0 && dis[p]+map[p][j] < dis[j]) {//把其他点更新一遍 dis[j] = dis[p]+map[p][j]; //更新最短路径 } } } } int main(void) { while(scanf("%d%d", &n, &m) == 2 && n+m) { init(); int u, v, w; for(int i = 1; i <= m; i++) { scanf("%d%d%d", &u, &v, &w); if(w < map[u][v]) map[u][v] = map[v][u] = w; } dijkstra(); printf("%d\n", dis[n]); } }