L. Magical Girl Haze (分層圖最短路)
阿新 • • 發佈:2018-12-09
分層圖最短路的裸題。
#include<iostream> #include<stdio.h> #include<queue> #define LL long long using namespace std; const int N = 1e5+44; const int M = 400000+44; const LL inf = 0x3f3f3f3f3f3f3f3f; int head[N],nxt[M],to[M],cnt=-1; int W[M]; void add(int u,int v,int w) { cnt++; nxt[cnt]=head[u]; to[cnt]=v; W[cnt]=w; head[u]=cnt; } LL dis[N][11]; int vis[N][11]; struct node { int u,k; LL dis; node(int uu,LL dd,int kk):u(uu),dis(dd),k(kk){} bool friend operator < (node a,node b) { return a.dis>b.dis; } }; int n,m,k; LL dij() { for(int i=1;i<=n;i++) for(int j=0;j<=k;j++) dis[i][j]=inf,vis[i][j]=0; dis[1][0]=0; priority_queue<node>q; q.push(node(1,0,0)); while(!q.empty()){ node now = q.top(); q.pop(); int u=now.u; int K=now.k; if(vis[u][K]) continue; vis[u][K]=1; for(int i=head[u];~i;i=nxt[i]){ int v=to[i]; if(dis[v][K]>dis[u][K]+W[i]){ dis[v][K]=dis[u][K]+W[i]; q.push(node(v,dis[v][K],K)); } if(K>=k) continue; if(dis[v][K+1]>dis[u][K]){ dis[v][K+1]=dis[u][K]; q.push(node(v,dis[v][K+1],K+1)); } } } return dis[n][k]; } int main() { int T; scanf("%d",&T); while(T--){ scanf("%d%d%d",&n,&m,&k); cnt=0; for(int i=1;i<=n;i++) { head[i]=-1; } while(m--){ int u,v,w; scanf("%d%d%d",&u,&v,&w); add(u,v,w); } printf("%lld\n",dij()); } return 0; }