Cod sursa(job #2021826)

Utilizator victoreVictor Popa victore Data 14 septembrie 2017 19:45:50
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>

#define x first
#define cost second

using namespace std;

const int nmax=155;
const int inf=1e9+5;

typedef pair<int,int> ii;


int n,m,k,p,dist[nmax];
int dp[nmax][3505];

vector<ii> g[nmax];

int am[nmax][3505];


int main()
{
    freopen("amenzi.in","r",stdin);
    freopen("amenzi.out","w",stdout);


    int i,j;

    scanf("%d%d%d%d",&n,&m,&k,&p);

    for(i=1;i<=n;++i)
        for(j=0;j<=3500;++j)
            dp[i][j]=-inf;
    dp[1][0]=0;

    int f,t,c;
    for(i=1;i<=m;++i)
    {
        scanf("%d%d%d",&f,&t,&c);
        g[f].push_back(ii(t,c));
        g[t].push_back(ii(f,c));
    }

    for(i=1;i<=k;++i)
    {
        scanf("%d%d%d",&f,&t,&c);
        am[f][t] += c;
    }

    int node;
    for(t=1;t<=3500;t++)
        for(node=1;node<=n;++node)
        {
            for(j=0;j<g[node].size();++j)
            {
                if(t - g[node][j].cost >=0)
                    dp[node][t] = max(dp[node][t] , dp[g[node][j].x][t-g[node][j].cost]);
            }

            dp[node][t] = max(dp[node][t] , dp[node][t-1]);

            if(dp[node][t] !=-inf)
                dp[node][t] +=am[node][t];
        }
    for(i=1;i<=p;++i)
    {
        scanf("%d%d",&f,&t);
        printf("%d\n",dp[f][t]);
    }
}