P4568 [JLOI2011]飛行路線 題解(分層圖模板)
阿新 • • 發佈:2021-08-02
題目連結
題目思路
這就是分層圖啊,其實感覺就是多維最短路而已
程式碼
卷也卷不過,躺又躺不平#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int,int> pii; #define fi first #define se second #define debug printf("aaaaaaaaaaa\n"); const int maxn=5e4+5,inf=0x3f3f3f3f,mod=1e9+7; const ll INF=0x3f3f3f3f3f3f3f3f; const double eps=1e-7; int n,m,k; int s,t; int head[maxn],cnt; int dis[maxn][15]; struct edge{ int to,next,w; }e[maxn<<1]; void add(int u,int v,int w){ e[++cnt]={v,head[u],w}; head[u]=cnt; } struct node{ int len,pos,free; friend bool operator<(node a, node b){ return a.len>b.len; } }; void dij(int x){ priority_queue<node> que; memset(dis,0x3f,sizeof(dis)); dis[x][0]=0; que.push({0,x,0}); while(!que.empty()){ int len=que.top().len; int pos=que.top().pos; int free=que.top().free; que.pop(); if(len!=dis[pos][free]) continue; for(int i=head[pos];i;i=e[i].next){ if(dis[e[i].to][free]>dis[pos][free]+e[i].w){ dis[e[i].to][free]=dis[pos][free]+e[i].w; que.push({dis[e[i].to][free],e[i].to,free});//一定注意是len為fi } if(free<k){ if(dis[e[i].to][free+1]>dis[pos][free]){ dis[e[i].to][free+1]=dis[pos][free]; que.push({dis[e[i].to][free+1],e[i].to,free+1});//一定注意是len為fi } } } } } int main(){ cin>>n>>m>>k; cin>>s>>t; for(int i=1,u,v,w;i<=m;i++){ cin>>u>>v>>w; add(u,v,w),add(v,u,w); } dij(s); int ans=inf; for(int i=0;i<=k;i++){ ans=min(ans,dis[t][i]); } printf("%d\n",ans); return 0; }