CF721C. Journey

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF721C. Journey相关的知识,希望对你有一定的参考价值。

传送门

说实话,这是一道非常简单的DP题,简单到如果放到NOIp第二题可能都有些差强人意,然而我写崩了。

 

所以简单记录一下。

需要注意的是,这道题的DP应该是从$N$点开始,以1为边界,满足最短路的三角形性质即可转移。

技术分享
 1 //cf c
 2 //by Cydiater
 3 //2016.9.30
 4 #include <iostream>
 5 #include <cstdio>
 6 #include <cstring>
 7 #include <string>
 8 #include <algorithm>
 9 #include <queue>
10 #include <map>
11 #include <ctime>
12 #include <cmath>
13 #include <cstdlib>
14 #include <iomanip>
15 using namespace std;
16 #define ll long long
17 #define up(i,j,n)       for(int i=j;i<=n;i++)
18 #define down(i,j,n)     for(int i=j;i>=n;i--)
19 const int MAXN=1e6+5;
20 const int oo=0x3f3f3f3f;
21 inline ll read(){
22       char ch=getchar();ll x=0,f=1;
23       while(ch>9||ch<0){if(ch==-)f=-1;ch=getchar();}
24       while(ch>=0&&ch<=9){x=x*10+ch-0;ch=getchar();}
25       return x*f;
26 }
27 int LINK[MAXN],len=0,N,M,T,ans=0,lastnode[MAXN],q[MAXN],top=0;
28 bool vis[MAXN];
29 ll f[5005][5005];
30 struct edge{
31       int y,next;ll v;
32 }e[MAXN];
33 namespace solution{
34       inline void insert(int x,int y,int v){e[++len].next=LINK[x];LINK[x]=len;e[len].y=y;e[len].v=v;}
35       void init(){
36             N=read();M=read();T=read();
37             up(i,1,M){
38                   ll x=read(),y=read(),v=read();
39                   insert(y,x,v);
40             }
41       }
42       void dfs(int node){
43             if(vis[node])return;
44             for(int i=LINK[node];i;i=e[i].next)if(!vis[e[i].y])dfs(e[i].y);
45             for(int i=LINK[node];i;i=e[i].next)if(e[i].v>0)
46                   up(j,1,N)if(f[e[i].y][j-1]+e[i].v<f[node][j]){
47                         f[node][j]=f[e[i].y][j-1]+e[i].v;
48                         if(node==N&&f[node][j]<=T)ans=max(ans,j);
49                   }
50             vis[node]=1;
51       }
52       void re_dfs(int node,int num){
53             for(int i=LINK[node];i;i=e[i].next)if(num>0){
54                   if(f[e[i].y][num-1]==f[node][num]-e[i].v){
55                         lastnode[node]=e[i].y;
56                         re_dfs(e[i].y,num-1);
57                         return;
58                   }
59             }
60       }
61       void DP(){
62             memset(f,10,sizeof(f));
63             f[1][1]=0;
64             dfs(N);
65       }
66       void output(){
67             cout<<ans<<endl;
68             if(ans==0)return;
69             re_dfs(N,ans);
70             for(int i=N;i!=0;i=lastnode[i])q[++top]=i;
71             down(i,top,1)printf("%d ",q[i]);
72             puts("");
73       }
74 }
75 int main(){
76       //freopen("input.in","r",stdin);
77       using namespace solution;
78       init();
79       DP();
80       output();
81       return 0;
82 }
View Code

 

以上是关于CF721C. Journey的主要内容,如果未能解决你的问题,请参考以下文章

[CodeForce721C]Journey

CodeForces 721C Journey

codeforces 721C journey

CF #374 (Div. 2) C. Journey dp

解题报告CF DIV2 #ROUND 721 A~C

CF-721C DAG图拓扑排序+费用DP