码迷,mamicode.com
首页 > 其他好文 > 详细

最短路

时间:2021-03-01 13:48:57      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:sizeof   初始化   a算法   下标   jks   优化   最短路径   pac   dijkstra   

一、单源最短路径

1.朴素Dijkstra算法

#include <bits/stdc++.h>

using namespace std;
const int N = 1000;

//数组g为邻接矩阵用于存放权值, 数组dis[i]表示起点到节点i的距离, n代表点的个数, m代表边的个数
int g[N][N], dis[N], n, m;                              
bool v[N];                                              //数组v用于标记起点到当前节点的最短路径是否已经确定

void dijkstra() {
    memset(dis, 0x3f, sizeof dis);                      //初始化起点到各个点的距离为 +∞
    memset(v, 0, sizeof v);                             //初始化起点到各个点的最短距离为未确定状态
    dis[1] = 0;                                         //起点到起点的距离设为0

    for (int i = 1; i < n; i++) {
        int x = 0;                                      //x表示起点到当前节点为最短距离的那个节点的下标
        //找到未标记节点中dis最小的
        for (int j = 1; j <= n; j++)
            if (!v[j] && (x == 0 || dis[j] < dis[x]))   //节点j未标记并且起点到节点j的距离比到节点x的距离短
                x = j;                                  //更新一下代表最短路径的节点下标
        v[x] = 1;                                       //起点到当前的节点x的距离必定最短了, 所以可以标记节点x了
        for (int y = 1; y <= n; y++)                    //这次是遍历节点x的所有出边即x-->y 
            dis[y] = min(dis[y], dis[x] + g[x][y]);     //由于起点到节点x的最短距离已经确定, 那么起点到节点y的距离根据左式更新一下就ok
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> m;
    memset(g, 0x3f, sizeof g);
    for (int i = 1; i <= n; i++) g[i][i] = 0;           //去除自环
    for (int i = 1; i <= m; i++) {
        int x, y, z;
        cin >> x >> y >> z;
        g[x][y] = min(g[x][y], z);                      //构建邻接矩阵
    }
    dijkstra();
    //这部分内容根据题意自己写

    return 0;
}

2.堆优化Dijkstra算法

3.Bellman-Ford算法

4.SPFA算法

二、All-Pairs最短路径问题

Floyd-Warshall算法

最短路

标签:sizeof   初始化   a算法   下标   jks   优化   最短路径   pac   dijkstra   

原文地址:https://www.cnblogs.com/xiezeju/p/14459052.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!