Cod sursa(job #1091476)

Utilizator vlad96Vlad Zuga vlad96 Data 25 ianuarie 2014 18:46:45
Problema Amenzi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <stdio.h>
#include <vector>
#define max_t 3505
#define max_n 155
#define INF 0x3f3f3f3f

using namespace std;

int d[max_t][max_n], cost[max_n][max_n], amenzi[max_t][max_n];
int n, m, k, p, a, b, c, x, t1;
vector <int> v[max_n];

void solve ()
{
    for (int t = 1; t < max_t; t ++ )
    {
        for (int i = 1; i <= n; i ++ )
        {
            for (int j = 0; j < v[i].size(); j ++ )
            {
                x = v[i][j];
                t1 = t - cost[i][x];
                if ( t1 > 0 )
                {
                    d[t][i] = max (d[t][i], d[t1][x]);
                }
            }
            d[t][i] = max (d[t][i], d[t-1][i]);
            if ( d[t][i] != -INF )
                d[t][i] += amenzi[t][i];
        }
    }
}

void read_write ()
{
    FILE *fis = fopen ("amenzi.in", "r");
    FILE *fis2 = fopen ("amenzi.out", "w");
    fscanf(fis, "%d %d %d %d", &n, &m, &k, &p);
    for (int i = 1; i <= m; i ++ )
    {
        fscanf(fis, "%d %d %d", &a, &b, &c);
        cost[a][b] = cost[b][a] = c;
        v[a].push_back(b), v[b].push_back(a);
    }
    for (int i = 1; i <= k; i ++ )
    {
        fscanf(fis, "%d %d %d", &a, &b, &c);
        amenzi[b][a] += c;
    }

    for (int t = 0; t <= max_t; t ++ )
        for ( int i = 0; i <= max_n; i ++ )
            d[t][i] = -INF;
    solve();

    for ( int i = 1; i <= p; i ++ )
    {
        fscanf(fis, "%d %d", &a, &b);
        if ( d[b][a] != -INF )
            fprintf(fis2, "%d\n", d[b][a]);
        else
            fprintf(fis2, "0\n");
    }
    fclose(fis);
    fclose(fis2);
}

int main()
{
    read_write();
    return 0;
}