Cod sursa(job #1502266)

Utilizator akaprosAna Kapros akapros Data 14 octombrie 2015 14:25:22
Problema Amenzi Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define maxC 120000002
#define pb push_back
#define mp make_pair
#define f first
#define s second
#define maxN 152
#define maxT 3502
using namespace std;
int n, m, k, p, x, y, i, j, cost[maxN][maxT], dp[maxN][maxT];
vector < pair < int, int > > V[maxN];
void read()
{
    int a, b, c;
    freopen("amenzi.in", "r", stdin);
    scanf("%d %d %d %d", &n, &m, &k, &p);
    while (m --)
    {
        scanf("%d %d %d", &a, &b, &c);
        V[a].pb(mp(b, c));
        V[b].pb(mp(a, c));
    }
    for (i = 1; i <= k; ++ i)
    {
        scanf("%d %d %d", &a, &b, &c);
        cost[a][b] += c;
    }
}

void solve()
{
    int node, time;
    //for (j = 0; j < maxT; ++ j)
    for (i = 1; i <= n; ++ i)
        dp[i][0] = -maxC;
    dp[1][0] = cost[1][0];
    for (j = 1; j < maxT; ++ j)
        for (i = 1; i <= n; ++ i)
        {
            dp[i][j] = dp[i][j - 1] + cost[i][j];
            for (k = 0; k < V[i].size(); ++ k)
            {
                node = V[i][k].f;
                time = V[i][k].s;
                if (time <= j && dp[i][j] < dp[node][j - time] + cost[i][j])
                    dp[i][j] = dp[node][j - time] + cost[i][j];
            }
        }
}
void write()
{
    freopen("amenzi.out", "w", stdout);
    while (p --)
    {
        scanf("%d %d", &x, &y);
        if (dp[x][y] < 0)
            printf("-1\n");
        else
            printf("%d\n", dp[x][y]);
    }
}
int main()
{
    read();
    solve();
    write();
    return 0;
}