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]);
    }
}
posted @ 2019-04-24 17:02  boobo  阅读(348)  评论(0编辑  收藏  举报
^