Cod sursa(job #1626453)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 3 martie 2016 09:00:53
Problema Amenzi Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <iostream>
#include <cstdio>
#include <vector>
#define MAXN 160
#define MAX_TIMP 3550

using namespace std;

int amenda[MAX_TIMP][MAXN];
int cost[MAXN][MAXN], din[MAX_TIMP][MAXN]; /// din[j][i] = amenda maxima a.i sa fiu la nodul i la momentul j
vector<int> graf[MAXN];
int n, m, k, p;

void citire()
{
    scanf("%d %d %d %d", &n, &m, &k, &p);
    int a, b, c;
    for (int i = 1; i <= m; i++) {
		scanf("%d %d %d", &a, &b, &c);
        cost[a][b] = c;
        cost[b][a] = c;
        graf[a].push_back(b);
		graf[b].push_back(a);
    }
    for (int i = 1; i <= n; i++) {
		cost[i][i] = 1;
		graf[i].push_back(i);
    }
	for (int i = 1; i <= k; i++) {
		scanf("%d %d %d", &a, &b, &c);
        amenda[b][a] += c;
	}
}

void solve()
{
	for (int i = 0; i < MAX_TIMP-5; i++)
		for (int j = 1; j <= n; j++)
			din[i][j] = -1;
    din[0][1] = 0;
    for (int t = 0; t < MAX_TIMP-5; t++) {
        for (int i = 1; i <= n; i++) {
            if (din[t][i] < 0) continue;
			din[t][i] += amenda[t][i];
            for (int j = 0, sz = graf[i].size(); j < sz; j++) {
                int y = graf[i][j];
                if (t+cost[i][y] >= MAX_TIMP-5) continue;
                din[t+cost[i][y]][y] = max(din[t+cost[i][y]][y], din[t][i]);
            }
        }
    }
}

void afisare()
{
//    for (int i = 1; i <= n; i++, printf("\n"))
//		for (int j = 0; j <= 50; j++)
//			printf("%d ", din[j][i]);
	int a, b;
	for (int i = 1; i <= p; i++) {
		scanf("%d %d", &a, &b);
        printf("%d\n", din[b][a]);
	}
}

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

    citire();
    solve();
	afisare();

    return 0;
}