80pts求助
查看原帖
80pts求助
399116
LYqwq楼主2022/3/12 16:54
#include <iostream>
#include <queue>
using namespace std;
const int N=1e4+5,M=2e5+5,inf=0x3f3f3f3f;
struct edge{
    int to,nxt,val;
}e[M];
int n,m,u,v,w;
int head[N],top;
int dist[3][N],vis[N];
int pre[3][N],dfn[N];
priority_queue<pair<int,int>> q;

template<typename T=int>
inline T read(){
    T X=0; bool flag=1; char ch=getchar();
    while(ch<'0' || ch>'9'){if(ch=='-') flag=0; ch=getchar();}
    while(ch>='0' && ch<='9') X=(X<<1)+(X<<3)+ch-'0',ch=getchar();
    if(flag) return X;
    return ~(X-1);
}

template<typename T=int>
inline void write(T X){
    if(X<0) putchar('-'),X=~(X-1);
    T s[20],top=0;
    while(X) s[++top]=X%10,X/=10;
    if(!top) s[++top]=0;
    while(top) putchar(s[top--]+'0');
    putchar(' ');
}

void add(int u,int v,int w){
    top++;
    e[top].to=v;
    e[top].val=w;
    e[top].nxt=head[u];
    head[u]=top;
}

void dijkstra(int c){
    for(int i=1; i<=n; i++){
        dist[c][i]=inf;
        vis[i]=0;
        dfn[i]=0;
    }
    dist[c][1]=0;
    q.push(make_pair(0,1));
    while(!q.empty()){
        u=q.top().second;
        q.pop();
        if(vis[u]) continue;
        vis[u]=1;
        for(int i=head[u]; i; i=e[i].nxt){
            v=e[i].to;
            if(dist[c][v]>dist[c][u]+e[i].val+dfn[u]){
                dist[c][v]=dist[c][u]+e[i].val+dfn[u];
                dfn[v]=dfn[u]+1;
                pre[c][v]=u;
                q.push(make_pair(-dist[c][v],v));
            }
        }
    }
}

void print(int x,int c){
    if(pre[c][x]) print(pre[c][x],c);
    write(x);
}

int main(){
    n=read(),m=read();
    while(m--){
        u=read(),v=read(),w=read();
        add(u,v,w);
    }
    dijkstra(1);
    dijkstra(2);
    write(min(dist[1][n],dist[2][n]));
    puts("");
    if(dist[1][n]>dist[2][n]) print(n,1);
    else print(n,2);
    return 0;
}

rt,不知道哪错了 /kel

2022/3/12 16:54
加载中...