- 通过每条小径都需要消耗一定的时间.约翰打算升级其中K条小径,使之成为高 速公路.在高速公路上的通行几乎是瞬间完成的,所以高速公路的通行时间为0.
- 请帮助约翰决定对哪些小径进行升级,使他每天从1号牧场到第N号牧场所花的时间最短
-
#include<bits/stdc++.h> using namespace std; #define maxn 10555 #define inf 0x3f3f3f3f long long n,m,k,s,t,u,v,ans,w; long long dis[maxn][25],vis[maxn][25]; struct node { long long y,z; } temp; vector<node>mmp[maxn]; struct pp { long long v; long long w,kk; pp(int _v=0,long long _w=0,int _kk=0):v(_v),w(_w),kk(_kk) {} bool operator<(const pp&h)const { return w>h.w; } }; void dij() { priority_queue<pp>q; for(int i=1; i<=n; i++) for(int j=0; j<21; j++) dis[i][j]=inf; for(int i=0; i<21; i++) dis[s][i]=0; q.push(pp(s,0,0)); while(!q.empty()) { long long cnt=q.top().kk; long long net=q.top().v; q.pop(); if(vis[net][cnt]) continue; vis[net][cnt]=1; for(int i=0; i<mmp[net].size(); i++) { int v=mmp[net][i].y; int w=mmp[net][i].z; if(dis[net][cnt]+w<dis[v][cnt]) { dis[v][cnt]=dis[net][cnt]+w; if(!vis[v][cnt]) q.push(pp(v,dis[v][cnt],cnt)); } if(cnt<k&&dis[net][cnt]<dis[v][cnt+1]) { dis[v][cnt+1]=dis[net][cnt]; if(!vis[v][cnt+1]) q.push(pp(v,dis[v][cnt+1],cnt+1)); } } } } int main() { ans=inf; cin>>n>>m>>k; while(m--) { cin>>u>>v>>w; temp.y=v; temp.z=w; mmp[u].push_back(temp); temp.y=u; temp.z=w; mmp[v].push_back(temp); } s=1; t=n; dij(); for(int i=0; i<=k; i++) ans=min(dis[t][i],ans); cout<<ans<<endl; return 0; }