[USACO09FEB]改造路Revamping Trails

题意翻译
约翰一共有N)个牧场.由M条布满尘埃的小径连接.小径可 以双向通行.每天早上约翰从牧场1出发到牧场N去给奶牛检查身体.

通过每条小径都需要消耗一定的时间.约翰打算升级其中K条小径,使之成为高 速公路.在高速公路上的通行几乎是瞬间完成的,所以高速公路的通行时间为0.

请帮助约翰决定对哪些小径进行升级,使他每天从1号牧场到第N号牧场所花的时间最短

输入输出样例
输入 #1复制
4 4 1
1 2 10
2 4 10
1 3 1
3 4 100
输出 #1复制
1


裸的最短路+dp 或者 分层图。 最短路+dp已经写过很多了,这次就随便写了个分层图。

但是我们要注意,升级K条路径。有K+1层图。


AC代码:

#include
#define int long long
using namespace std;
const int N=4e5+10,M=8e6+10;
int n,m,k,d[N],vis[N];
int head[N],nex[M],to[M],w[M],tot;
inline void ade(int a,int b,int c){to[++tot]=b; nex[tot]=head[a]; w[tot]=c; head[a]=tot;
}
inline void add(int a,int b,int c){ade(a,b,c);  ade(b,a,c);}
inline void Dijkstra(){priority_queue<pair<int,int> > q;   q.push({0,1});memset(d,0x3f,sizeof d);    d[1]=0;while(q.size()){int u=q.top().second; q.pop();if(vis[u])  continue;   vis[u]=1;for(int i=head[u];i;i=nex[i]){if(d[to[i]]>d[u]+w[i]){d[to[i]]=d[u]+w[i]; if(!vis[to[i]])	q.push({-d[to[i]],to[i]});}}}
}
signed main(){ios::sync_with_stdio(false);cin>>n>>m>>k;for(int i=1,a,b,c;i<=m;i++){cin>>a>>b>>c;   add(a,b,c);for(int j=1;j<=k;j++){ade((j-1)*n+a,j*n+b,0);ade((j-1)*n+b,j*n+a,0);add(j*n+a,j*n+b,c);}}Dijkstra();cout<<d[k*n+n]<<endl;return 0;
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部