Dijkstra求最短路 (朴素版本)边权为正


题目:https://www.acwing.com/problem/content/851/


Dijstra朴素版求单源最短路问题:

1、适用情况:适用于稠密图(边数远大于点数)

2、算法分析:

  • Dijstra算法的核心就是先假设所有的点到起点的距离为无穷大,然后通过枚举每一个点到起点的距离,找到其中距离起点距离最短的那个点,通过该点来更新剩下没有选中的点到起点的距离,然后在通过枚举剩下的点到该点的距离,取其中最小的,重复上述更新距离的操作即可。
  • 在了解的算法思路后,一定要牢记模板,加深理解。

3、题解:

#include 
#include 
#include 
using namespace std;
const int N = 510;
int g[N][N], dis[N];
bool judge[N];
int n, m;

int dijstra()
{
    memset(dis, 0x3f, sizeof dis);
    dis[1] = 0;
    for(int i = 1; i < n; i++)  // n次迭代(就是找n次距离最短的点)
    {
        int t = -1;  // t=-1的目的是为了在剩下没有更新的点中找到第一个点更方便。
        for(int j = 1; j <= n; j++)
        if(!judge[j] && (t == -1 || dis[t] > dis[j]))  // 如果没有t的话 找到第一个更新的点就会比较麻烦
        t = j;
        
        for(int j = 1; j <= n; j++)
        dis[j] = min(dis[j], dis[t] + g[t][j]);   // 更新距离
        judge[t] = true;  // 并入集合
    }
    if(dis[n] == 0x3f3f3f3f) return -1;
    return dis[n];
}
int main()
{
    cin >> n >> m;
    memset(g, 0x3f, sizeof g);
    while(m--)
    {
        int a, b, c;
        cin >> a >> b >> c;
        g[a][b] = min(g[a][b], c);  // 防止重边和自环,但自环在朴素版dijstra中没有什么影响
    }
    cout << dijstra() << endl;
    return 0;
}