说实话,这是一道非常简单的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 }
时间: 2024-10-13 05:30:40