Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<vector>
- using namespace std;
- int n,m,k;
- int st,sp;
- struct edge{
- int v,c,w;
- };
- vector<edge> adj[310];
- int dp[310][2010];
- int recur(int u,int t){
- if(dp[u][t] != -1)return dp[u][t];
- int maxa = ( u == sp ? 0 : -2e9 );
- for(int i = 0 ; i < adj[u].size();i++){
- int v = adj[u][i].v;
- int c = adj[u][i].c;
- int w = adj[u][i].w;
- if(t - w >= 0)maxa = max(maxa,recur(v,t - w) + c);
- }
- // printf("test %d %d : %d\n",u,t,maxa);
- return dp[u][t] = maxa;
- }
- int main()
- {
- for(int i=0;i<310;i++)for(int j=0;j<2010;j++)dp[i][j] = -1;
- scanf("%d %d %d",&n,&m,&k);
- scanf("%d %d",&st,&sp);
- for(int i=1;i<=m;i++){
- int u,v,c,w;
- scanf("%d %d %d %d",&u,&v,&c,&w);
- adj[u].push_back({v,c,w});
- adj[v].push_back({u,c,w});
- }
- int ans = recur(st,k);
- if(ans > 0){
- printf("%d",ans);
- }else{
- printf("Impossible");
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment