P3371最短路板子10pts求助
查看原帖
P3371最短路板子10pts求助
112048
dfydn楼主2024/5/6 17:30
#include<stdio.h>
#include<stdlib.h>
typedef struct Edge{
    int dest;
    int w;
    struct Edge *next;
}Edge;
typedef struct Node{
    int key;
    struct Edge *edge;
}Node;
Node queue[500005];
int size=0;
int n,m,k,flag;
int dist[500005], vis[500005];
Node vertex[500005];
void push_up(){
    int i=size;
    Node temp=queue[i];
    while(i>1 && dist[temp.key]<dist[queue[i/2].key]){
        queue[i]=queue[i/2];
        i/=2;
    }
    queue[i]=temp;
}
void push_down(){
    int i=1;
    Node temp=queue[i];
    while(2*i<=size){
        int j=2*i;
        if(j!=size&&dist[queue[j].key]>dist[queue[j+1].key]) j++;
        if(dist[queue[j].key]<dist[temp.key]){
            queue[i]=queue[j];
            i=j;
        }
        else break;
    }
    queue[i]=temp;
}
void push(Node x){
    queue[++size]=x;
    push_up();
}
Node pop(){
    Node x=queue[1];
    queue[1]=queue[size--];
    push_down();
    return x;
}
void create_node(int n){
    for(int i=1;i<=n;i++){
        vertex[i].key=i;
        vertex[i].edge=NULL;
    }
}
void add_edge(int a,int b,int c){
    Edge* edge=(Edge*)malloc(sizeof(Edge));
    edge->dest=b;
    edge->w=c;
    edge->next=vertex[a].edge;
    vertex[a].edge=edge;
}
void init(int s){
    for(int i=1;i<=n;i++) dist[i]=1e9+5;
    for(int i=1;i<=n;i++){
        vis[i]=0;
    }
    dist[s]=0;
    while(size) pop();
}
void dijkstra(int s){
    push(vertex[s]);
    while(size){
        Node x=pop();
        if(vis[x.key]) continue;
        vis[x.key]=1;
        for(Edge* edge=x.edge;edge;edge=edge->next){
            int v=edge->dest;
            if(vis[v]) continue;
            if(dist[v]>dist[x.key]+edge->w){
                dist[v]=dist[x.key]+edge->w;
                if(!vis[v]) push(vertex[v]);
            }
        }
    }
}
int main(){
    int s;
    scanf("%d%d%d",&n,&m,&s);
    create_node(n);
    while(m--){
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        add_edge(a,b,c);
    }
    init(s);
    dijkstra(s);
    for(int i=1;i<=n;i++){
        printf("%d ",dist[i]);
    }
    return 0;
}
2024/5/6 17:30
加载中...