Dijsktra 单源最短路 模板

算法分析:
用Dis数组存放从出发点到每个点的最近距离,当然Dis[出发点]就是0了
然后每次从没有使用过的边中找出最小的一个,用其依次更新Dis[0..n-1]
更新条件:Dis[k]+a[k][to] < Dis[to] //感觉这跟Floyd有几分相似啊

代码实现
(下面的模板是long long ago写的了,水平略渣见笑了)

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<queue>
using namespace std;
int n,m,l;
struct Edge{
    int x,y,w;
    Edge(){
        x=0;y=0;w=0;
    }
    friend bool operator < (Edge a,Edge b){
        return a.w>b.w;
    }
};
int main(){
    scanf("%d%d%d",&n,&m,&l);
    int a[n+5][n+5];
    memset(a,0x3f,sizeof(a));
    for(int i=0;i<l;i++){
        int x,y,w;
        scanf("%d%d%d",&x,&y,&w);
        a[x][y]=a[y][x]=min(a[x][y],w);
    }
    bool In[n+5];
    memset(In,true,sizeof(In));
    In[m]=false;
    int Pi=1,Dis[n+5];
    memset(Dis,0x3f,sizeof(Dis));
    for(int i=1;i<=n;i++)
        Dis[i]=a[m][i];
    Dis[m]=0;
    while(Pi<n){   
        int minn=1;     
        for(int i=1;i<=n;i++)
            minn= Dis[i]>Dis[minn] ? i : minn;
        for(int i=1;i<=n;i++)
            minn= Dis[i]<Dis[minn]&&In[i] ? i : minn;
        In[minn]=false;
        for(int i=1;i<=n;i++)
            Dis[i]=min(Dis[i],Dis[minn]+a[i][minn]);
        Pi++;
    }
    for(int i=1;i<=n;i++)
        printf("%d ",Dis[i]);
    return 0;
}

By YOUSIKI

你可能感兴趣的:(Dijsktra 单源最短路 模板)