0pts求调

P1983 [NOIP2013 普及组] 车站分级

IT_theory @ 2024-07-31 15:54:37

#include <bits/stdc++.h>
using namespace std;
int n,m,k,s,t,ecnt,go[4000010],adj[2000010],nxt[4000010],dis[2000010],wo[4000010],vis[2000010];
struct Edge { int u,v,w;} e[50010];
void add(int u,int v,int w) { go[++ecnt]=v, nxt[ecnt]=adj[u], adj[u]=ecnt, wo[ecnt]=w;}
int main() {
    scanf("%d%d%d%d%d",&n,&m,&k,&s,&t); 
    for (int i=1;i<=m;i++) scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
    for (int i=0;i<=k;i++) for (int j=1;j<=m;j++) add(e[j].u+i*n,e[j].v+i*n,e[j].w),add(e[j].v+i*n,e[j].u+i*n,e[j].w);
    for (int i=1;i<=k;i++) for (int j=1;j<=m;j++) add(e[j].v+(i-1)*n,e[j].u+i*n,0),add(e[j].u+(i-1)*n,e[j].v+i*n,0);
    priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
    memset(dis,0x3f,sizeof(dis));
    dis[s]=0, q.push(pair<int,int> (dis[s],s));
    while (!q.empty()) {
        int x=q.top().second; q.pop();
        if (vis[x]) continue;
        vis[x]=1;
        for (int i=adj[x];i;i=nxt[i]) if (dis[go[i]]>dis[x]+wo[i]) 
            dis[go[i]]=dis[x]+wo[i], q.push(pair<int,int> (dis[go[i]],go[i]));
    }
    int ans=1e9;
    for (int i=0;i<=k;i++) ans=min(ans,dis[t+i*n]);
    printf("%d\n",ans);
    return 0;
}

|