Cod sursa(job #1876400)

Utilizator GinguIonutGinguIonut GinguIonut Data 12 februarie 2017 12:43:45
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <string.h>

#define tMax 3501
#define nMax 151
#define mMax 1501
#define pMax 8001
#define pb push_back
#define mkp make_pair
#define x first
#define y second

using namespace std;

ifstream fin("amenzi.in");
ofstream fout("amenzi.out");

int n, m, k, p;
int dp[tMax][nMax], Sol[pMax], vDp[nMax];
pair<pair<int, int>, int> edges[mMax];
vector<pair<int, int> > crime[tMax];
vector<pair<int, int> > meet[tMax];

int main()
{
    int a, b, c;
    fin>>n>>m>>k>>p;
    for(int i=1; i<=m; i++)
    {
        fin>>a>>b>>c;
        edges[i]=mkp(mkp(a, b), c);
    }
    for(int i=1; i<=k; i++)
    {
        fin>>a>>b>>c;
        crime[b].pb(mkp(a, c));
    }
    for(int i=1; i<=p; i++)
    {
        fin>>a>>b;
        meet[b].pb(mkp(a, i));
    }

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

    for(int time=0; time<tMax; time++)
    {
        memset(vDp, -1, sizeof(vDp));
        if(time)
        {
            for(int i=1; i<=m; i++)
            {
                int node1=edges[i].x.x, node2=edges[i].x.y, cost=edges[i].y;
                if(cost<=time && dp[time-cost][node1]!=-1)
                    vDp[node2]=max(vDp[node2], dp[time-cost][node1]);
                if(cost<=time && dp[time-cost][node2]!=-1)
                    vDp[node1]=max(vDp[node1], dp[time-cost][node2]);
            }
            for(int i=1; i<=n; i++)
            {
                dp[time][i]=vDp[i];
                dp[time][i]=max(dp[time][i], dp[time-1][i]);
            }
        }
        for(vector<pair<int, int> >::iterator it=crime[time].begin(); it!=crime[time].end(); it++)
        {
            int node=it->first, cost=it->second;
            if(dp[time][node]!=-1)
                dp[time][node]+=cost;
        }
        for(vector<pair<int, int> >::iterator it=meet[time].begin(); it!=meet[time].end(); it++)
        {
            int node=it->first, poz=it->second;
            Sol[poz]=dp[time][node];
        }
    }
    for(int i=1; i<=p; i++)
        fout<<Sol[i]<<'\n';
}