UOJ Logo Lts的博客

博客

Dijkstra__指针链式前向星__Priority_queue

2021-09-14 16:51:42 By Lts

图论

衍用指针

可以说是很简单的算法了,加入指针更易理解(口碑不一) 最大感受:

指针大法好

以下提供实现代码

#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=10010;
const int INF=0x3fffffff;
int cnt, n, m, x;
int v[maxn], dis[maxn]; 
struct edge{
    int from, to, dis;
    edge * next;
    edge(){
        next=NULL;
    }
    edge(int u, int v, int d, edge * e){
        from=u;
        to=v;
        dis=d;
        next=e;    
    }
};
edge * h[maxn];
void add(int u, int v, int d){
    h[u]=new edge(u, v, d, h[u]);
}
struct mp{
    int pot, dis;
    mp(int x, int y){
        pot=x;
        dis=y;
    }
    bool operator<(mp r)const{
        return dis>r.dis;
    }
};
void dijkstra(int x){
    memset(v, 0, sizeof(v));
    for(int i=1; i<=n; i++)
        dis[i]= i==x ? 0 : INF;
    priority_queue<mp, vector<mp>, less<mp> >    Q;
    Q.push(mp(x, dis[x]));
    while(!Q.empty()){
        int po=Q.top().pot;
        int d=Q.top().dis;
        Q.pop();
        if(v[po])    continue;
        else    v[po]=true;
        for(edge * i=h[po]; i!=NULL; i=i->next){
            int y=i->to;
            if(d+i->dis<=dis[y]){
                dis[y]=d+i->dis;
                Q.push(mp(y, dis[y])); 
            }
        }
    }
}
int main(){
    cin>>n>>m>>x;
    for(int i=1; i<=m; i++){
        int u, v, d;
        cin>>u>>v>>d;
        add(u, v, d);
        add(v, u, d);
    }
    dijkstra(x);
    for(int i=1; i<=n; i++)
        cout<<dis[i]<<endl;
    return 0;
}
Lts Avatar