NC24833. [USACO 2009 Feb G]Revamping Trails
描述
输入描述
* Line 1: Three space-separated integers: N, M, and K
* Lines 2..M+1: Line i+1 describes trail i with three space-separated integers: , , and
输出描述
* Line 1: The length of the shortest path after revamping no more than K edges
示例1
输入:
4 4 1 1 2 10 2 4 10 1 3 1 3 4 100
输出:
1
说明:
K is 1; revamp trail 3->4 to take time 0 instead of 100. The new shortest path is 1->3->4, total traversal time now 1.C++11(clang++ 3.9) 解法, 执行用时: 252ms, 内存消耗: 53156K, 提交时间: 2019-12-03 21:24:47
#include<bits/stdc++.h> using namespace std; struct edge { int net,to,w; }e[6000005]; int h[400005],cnt,dis[400005]; int vis[400005]; inline void add(int x,int y,int z) { e[++cnt]=(edge){h[x],y,z}; h[x]=cnt; } struct node { int x,dis; }; struct cmp { bool operator()(node a,node b) { return a.dis>b.dis; } }; priority_queue<node,vector<node>,cmp> q; int n,m,k,u,v,w; signed main() { scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=m;i++) { scanf("%d%d%d",&u,&v,&w); for(int j=0;j<=k;j++) { add(u+j*n,v+j*n,w); add(v+j*n,u+j*n,w); add(u+j*n,v+(j+1)*n,0),add(v+j*n,u+(j+1)*n,0); } } memset(dis,127/3,sizeof(dis)); dis[1]=0; q.push((node){1,0}); while(!q.empty()) { node k=q.top(); q.pop(); if(vis[k.x]) continue; vis[k.x]=1; for(int i=h[k.x];i;i=e[i].net) { int y=e[i].to; if(dis[y]>dis[k.x]+e[i].w) { dis[y]=dis[k.x]+e[i].w; q.push((node){y,dis[y]}); } } } printf("%d",dis[n+k*n]); return 0; }