Cod sursa(job #1758464)

Utilizator mariakKapros Maria mariak Data 17 septembrie 2016 12:20:09
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <bits/stdc++.h>
#define Nmax 152
#define Tmax 3502
#define pb(x) push_back(x)
#define pii pair <int, int>
#define mp make_pair
#define f first
#define s second

FILE *fin = freopen("amenzi.in", "r", stdin);
FILE *fut = freopen("amenzi.out", "w", stdout);

using namespace std;
int n, m, k, p, fine[Tmax][Nmax];
vector <pii> G[Nmax];
bool b[Tmax][Nmax];
int Max(int x, int y)
{
    if(x > y)
        return x;
    return y;
}
void read()
{
    int x, y, c;
    scanf("%d %d %d %d", &n, &m, &k, &p);
    while(m --)
    {
        scanf("%d %d %d", &x, &y, &c);
        G[x].pb(mp(y, c));
        G[y].pb(mp(x, c));
    }
    while(k --)
    {
        scanf("%d %d %d", &x, &y, &c);
        fine[y][x] += c;
    }
}
void solve()
{
    int val;
    /// initialize
    b[0][1] = 1;

    for(int t = 0; t < Tmax - 1; ++ t)
        for(int x = 1; x <= n; ++ x)
        {
            val = 0;
            if(t >= 1)
                if(b[t - 1][x])
                {
                    val = fine[t - 1][x];
                    b[t][x] = 1;
                }
            for(int k = 0; k < G[x].size(); ++ k)
            {
                pii y = G[x][k];
                if(t - y.s >= 0)
                    if(b[t - y.s][y.f])
                    {
                        val = Max(val, fine[t - y.s][y.f]);
                        if(!b[t][x])
                            b[t][x] = 1;
                    }
            }
            fine[t][x] += val;
        }
}
void write()
{
    int x, t;
    while(p --)
    {
        scanf("%d %d", &x, &t);
        if(b[t][x]) printf("%d\n", fine[t][x]);
            else printf("-1\n");

    }
}
int main()
{
    read();
    solve();
    write();
    return 0;
}