dijkstra板子

由于昨天没有更到足够数量的博客,今天又不能拖更。所以我选择来更一篇板子聊表心意

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
int n,m,x,y,z;
int dis[1003],g[1003][1003],vis[1003];
int main()
{
    //dijkstra
    cin>>n>>m;
    for(int i = 1;i <= n;i++)
        for(int j = 1;j <= n;j++)g[i][j] = 1000000000;
//i到j点间的距离被赋值为一个巨大的数 
    for(int i = 1;i <= m;i++){
        cin>>x>>y>>z;//输入x到y的权值为z 
        g[x][y] = min(g[x][y],z);
    }
    for(int i = 1;i <= n;i++)dis[i] = 1000000000;//让这个点到第i个点的距离均设为一个巨大的数 
    dis[1] = 0;//到自身的距离初始化为0 
    for(int i = 1;i <= n;i++)vis[i] = 0;//将所有的点都设为没被访问过的 
    for(int i = 1;i <= n;i++){
        int t = -1;

        for(int j = 1;j <= n;j++)
            if(vis[j] == 0 && (t == -1 || dis[j] < dis[t])) t = j;//如果这个点之前没被访问过,并且距离上一个访问的点距离最小,则这个点为下一个将被访问的点 
        vis[t] = 1;//把这个点设置为已访问过 
        for(int j = 1;j <= n;j++)
            if(vis[j] == 0)
                dis[j] = min(dis[j],dis[t] + g[t][j]);//如果这个点没被访问过,则求出经过那个被访问的点之后起点到第 j个点的距离 
                //松弛操作
    }
    for(int i = 1;i <= n;i++) printf("%d\n",dis[i]);//输出每个点到起点的距离 
}
//至于为什么不能有负边权呢?那是因为这个算法只能看到当前这一步中离被访问点最近的点,如果加上了负边权,那么下一步中含负边权的情况下就有可能会比按照这种垃圾算法算出的最小值小

好极了,这样又可以水一篇博客了

猜你喜欢

转载自blog.csdn.net/qq_42914224/article/details/82555288
今日推荐