【USACO09FEB】改造路Revamping Trails

链接

显而易见的 dp 方程,dp [ x ] [ i ] 表示到达点 x 免费了 i 条边的最短时间。

dp [ x ] [ i ] = min ( dp [ pre ] [ i - 1 ] , dp [ pre ] [ i ] + dis [ pre ] [ x ] ) ;

如果直接跑dp,得搞个拓扑图,并且环上信息不会统计。

考虑分层图,然后就是一个分层图模板了。

(回家画个图)

 1 #include<cstdio>
 2 #include<string>
 3 #include<cstring>
 4 #include<queue>
 5 #include<algorithm>
 6 #define int long long
 7 using namespace std;
 8 int read(){
 9     int x;scanf("%lld",&x);return x;
10 }
11
12 const int N=220005;
13
14 int n,m,k;
15 int p1,p2,t;
16
17 struct node{
18     int y,z,nxt;
19 }e[N*20];
20 int tot=0,h[N];
21 void ad(int x,int y,int z){
22     ++tot;e[tot].y=y;e[tot].z=z;e[tot].nxt=h[x];h[x]=tot;
23 }
24
25 int dis[N],vis[N];
26 priority_queue< pair<int,int> > q;
27 void dij(){
28
29     q.push(make_pair(0,1));
30     while(!q.empty()){
31         int x=q.top().second;q.pop();
32         if(vis[x])continue;
33         vis[x]=1;
34         for(int i=h[x];i;i=e[i].nxt){
35             int y=e[i].y;
36             if(dis[y]>dis[x]+e[i].z){
37                 dis[y]=dis[x]+e[i].z;
38                 q.push(make_pair(-dis[y],y));
39             }
40         }
41     }
42 }
43
44 signed main(){
45     n=read();m=read();k=read();
46     while(m--){
47         p1=read();p2=read();t=read();
48         ad(p1,p2,t);ad(p2,p1,t);
49         for(int j=1;j<=k;++j){
50             ad(p1+j*n,p2+j*n,t);ad(p2+j*n,p1+j*n,t);
51             ad(n*(j-1)+p1,n*j+p2,0);ad(n*(j-1)+p2,n*j+p1,0);
52         }
53     }
54     memset(dis,0x3f,sizeof(dis));
55     memset(vis,0,sizeof(vis));
56     dis[1]=0;
57     dij();
58     int ans=dis[n];
59     for(int i=1;i<=k;++i){
60         ans=min(ans,dis[n*i+n]);
61     }
62     printf("%lld",ans);
63 }

zpj直接yy出分层图,tql。

原文地址:https://www.cnblogs.com/chiyo/p/11434243.html

时间: 2024-10-10 19:01:52

【USACO09FEB】改造路Revamping Trails的相关文章

[USACO09FEB]改造路Revamping Trails

题目描述 Farmer John dutifully checks on the cows every day. He traverses some of the M (1 <= M <= 50,000) trails conveniently numbered 1..M from pasture 1 all the way out to pasture N (a journey which is always possible for trail maps given in the test

luoguP2939 [USACO09FEB]改造路Revamping Trails

约翰一共有N)个牧场.由M条布满尘埃的小径连接.小径可 以双向通行.每天早上约翰从牧场1出发到牧场N去给奶牛检查身体. 通过每条小径都需要消耗一定的时间.约翰打算升级其中K条小径,使之成为高 速公路.在高速公路上的通行几乎是瞬间完成的,所以高速公路的通行时间为0. 请帮助约翰决定对哪些小径进行升级,使他每天早上到牧场W花的时间最少.输出这个最少 的时间. 分层图DP,启发良多 1.远离SPFA,Dijstra+堆稳定多了 2.要在Dijstra中Dp,堆中必须包含三要素:当前点.层数.距离,缺一

【luogu P2939 [USACO09FEB]改造路Revamping Trails】 题解

题目链接:https://www.luogu.org/problemnew/show/P2939 本来说是双倍经验题,跟飞行路线一样的,结果我飞行路线拿deque优化SPFA过了这里过不了了. 所以多学一种优先队列优化. #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define ll long lon

P2939 [USACO09FEB]改造路Revamping Trails

传送门 显然的分层图 设 dis [ i ] [ j ] 表示到点 i , 已经建立了 j 条高速公路的最短距离 然后转移每次都分建立高速公路和不建立高速公路两种情况 跑Djikstra #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<queue> using namespace std

【分层图最短路,dijstra】P2939 [USACO09FEB]改造路Revamping Trails

1 #include<iostream> 2 #include<string> 3 #include<queue> 4 #include<stack> 5 #include<vector> 6 #include<map> 7 #include<cstdio> 8 #include<cstdlib> 9 #include<algorithm> 10 #include<set> 11 #in

USACO09FEB 改造路Revamping Trails(分层图模板)

满分做法: 因为\(k\)很小,所以把每个点拆出\(k\)个点,对应使了多少个高速,这个就是分层图了. #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<queue> #include<cmath> using namespace std; typedef long long ll; const int maxm=300

P2939 [USACO09FEB]改造路[分层图最短路]

题意翻译 约翰一共有N)个牧场.由M条布满尘埃的小径连接.小径可 以双向通行.每天早上约翰从牧场1出发到牧场N去给奶牛检查身体. 通过每条小径都需要消耗一定的时间.约翰打算升级其中K条小径,使之成为高 速公路.在高速公路上的通行几乎是瞬间完成的,所以高速公路的通行时间为0. 请帮助约翰决定对哪些小径进行升级,使他每天从1号牧场到第N号牧场所花的时间最短 解析 提高练习场看到这题,瞄一眼,诶,这不是分层图裸题吗??? [啥是分层图] 分层图,简单来说,就是把一张图复制多次,分为多份,每层图代表一种

BZOJ 1579: [Usaco2009 Feb]Revamping Trails 道路升级( 最短路 )

最短路...多加一维表示更新了多少条路 ---------------------------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<queue> #include<cstring> #include<iostream> #define rep( i , n ) for( int i

【BZOJ 1579】 1579: [Usaco2009 Feb]Revamping Trails 道路升级 (最短路)

1579: [Usaco2009 Feb]Revamping Trails 道路升级 Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M<=50,000)条双向泥土道路,编号为1..M. 道路i连接牛棚P1_i和P2_i (1 <= P1_i <= N; 1 <= P2_i<= N). John需要T_i (1 <= T_i <= 1,000,000)时间单位用道路i从P1_i走到P2_i或者从P2_i 走