Park[有向無環圖的DP]
阿新 • • 發佈:2018-12-16
---- From decoration
#include<bits/stdc++.h> #define N 2005 #define M 5005*2 #define LL long long using namespace std; int first[N],next[M],to[M],w[M],tot; int V,m,n,E,L,ans; int s[N],a[N],t[N],b[N],vis[N]; int f[N][N];//到i,經過k個點的最小花費 int read(){ int cnt=0;char ch=0; while(!isdigit(ch))ch=getchar(); while(isdigit(ch))cnt=cnt*10+(ch-'0'),ch=getchar(); return cnt; } void add(int x,int y,int z){ next[++tot]=first[x],first[x]=tot,to[tot]=y,w[tot]=z; } void dfs(int u){ vis[u]=1; f[u][1]=(b[u]==-1)? L+1:b[u]; for(int i=2;i<=V;i++) f[u][i]=L+1; for(int i=first[u];i;i=next[i]){ int t=to[i]; if(!vis[t]) dfs(t); for(int j=2;j<=V;j++) f[u][j]=min(f[u][j],f[t][j-1]+w[i]); } } int main(){ V=read(),m=read(),n=read(),E=read(),L=read(); for(int i=1;i<=V;i++) a[i]=b[i]=-1; for(int i=1;i<=m;i++){ int s=read();a[s]=read(); } for(int i=1;i<=n;i++){ int t=read();b[t]=read(); } for(int i=1;i<=E;i++){ int x=read(),y=read(),z=read(); add(x,y,z); } for(int i=1;i<=V;i++){ if(a[i]!=-1){ if(!vis[i]) dfs(i); for(int j=V;j>=1;j--) if(f[i][j]+a[i]<=L) ans=max(ans,j); } } cout<<ans;return 0; }