题解 P3371 【【模板】单源最短路径(弱化版)】

· · 题解

大佬都在用SPFA,本蒟蒻只好写个dijkstra算法玩玩. 1927ms.

#include<bits/stdc++.h>
using namespace std;
const int maxn=500013;
struct Edge{
    Edge(){
        v=0;
        w=0;
    }
    Edge(int _v,int _w){
        v=_v;
        w=_w;
    }
    int v,w;
};
vector<Edge> G[maxn];
int n,m;
int d[maxn];//从起始点到其它点最短距离
int vis[maxn];
void dijkstra(int s){
    const int inf=0x7fffffff;//2^32 -1
    for(int i=1;i<=n;i++){
        d[i]=inf;
    }
    d[s]=0;
    for(int q=1;q<=n;q++){
        // step1
        // find min_ and minindex
        int min_=0x7fffffff;
        int minindex=0;
        for(int i = 1; i <= n; i++) {
            if(d[i] < min_ && vis[i] == 0) {
                min_ = d[i];
                minindex = i;
            }
        }
        vis[minindex] = 1;
        // end of step 1
        // step2
        // use minindex to update array d[]
        for(int i=0;i<G[minindex].size();i++){
            Edge e=G[minindex][i];
            if(d[e.v]>d[minindex]+e.w){
                d[e.v]=d[minindex]+e.w;
            }
        }
        // end of step2
    }

}

int main(){
    int s;
    cin>>n>>m>>s;
    for(int i=1;i<=m;i++){
        int u,v,w;
        cin>>u>>v>>w;
        Edge temp1(v,w);
        G[u].push_back(temp1);
    }
    dijkstra(s);
    for(int i=1;i<=n;i++){
        cout<<d[i]<<' ';
    }
    cout<<endl;
}