zoukankan      html  css  js  c++  java
  • 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
    ", dis[n]);
        }
    }
  • 相关阅读:
    SRM482
    SRM481
    SRM480
    SRM479
    SRM478
    vue-cli 3 is not a modual err
    .vimrc
    css3 导入字体
    class []的用法
    RK61 Keyboard Use
  • 原文地址:https://www.cnblogs.com/RB26DETT/p/10763408.html
Copyright © 2011-2022 走看看