Park[有向无环图的DP]

---- 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;
}

猜你喜欢

转载自blog.csdn.net/sslz_fsy/article/details/83242096
今日推荐