Cod sursa(job #2051192)

Utilizator maria_sinteaMaria Sintea maria_sintea Data 28 octombrie 2017 17:23:19
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <cstdio>
#include <vector>
#define N 15005
#define max(a, b) a>b?a:b

using namespace std;

int n, m, k, p, x, y, c, val[N][N], din[N][N];
vector <pair<int, int> > graf[N];
pair<int, int> test[N];

void citire()
{
    scanf("%d %d %d %d\n", &n, &m, &k, &p);
    for(int i=0;i<m;i++)
    {
        scanf("%d %d %d\n", &x, &y, &c);
        graf[x].push_back(make_pair(y, c));
        graf[y].push_back(make_pair(x, c));
    }

    for(int i=0;i<k;i++)
    {
        scanf("%d %d %d\n", &x, &y, &c);
        val[x][y]+=c;
    }
}

void rezolvare(int timp)
{
    for(int nod=1;nod<=n;nod++)
    {
        if(din[nod][timp-1]!=-1)
            din[nod][timp]=din[nod][timp-1]+val[nod][timp];
        for(int i=0;i<graf[nod].size();i++)
        {
            int f=graf[nod][i].first;
            int min=graf[nod][i].second;
            if(timp-min>=0 && din[f][timp-min]!=-1)
                din[nod][timp]=max(din[nod][timp], din[f][timp-min]+val[nod][timp]);
        }
    }
}

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

    citire();
    int maxi=-1;
    for(int i=1;i<=p;i++)
    {
        scanf("%d %d\n", &test[i].first, &test[i].second);
        maxi=max(maxi, test[i].second);
    }

    for(int i=1;i<=n;i++)
        for(int j=0;j<=n;j++)
            din[i][j]=-1;
    din[1][0]=0;
    for(int i=1;i<=maxi;i++)
        rezolvare(i);

    for(int i=1;i<=p;i++)
    {
        int nod=test[i].first;
        int timp=test[i].second;
        printf("%d\n", din[nod][timp]);
    }
    return 0;
}