Cod sursa(job #1656457)

Utilizator llalexandruLungu Alexandru Ioan llalexandru Data 19 martie 2016 13:04:18
Problema Amenzi Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <fstream>
#define T 3505

using namespace std;

ifstream fin("amenzi.in");
ofstream fout("amenzi.out");

struct lista{int val, cost;};

lista A[155][155];
int n, m, f, caz;
int Amenda[T][155];
long long Mat[T][155];

void Citire();
void PD();
void Afisare();

int main()
{
    Citire();
    PD();
    /*int i, j;
    for (i=0; i<=50; i++)
    {
        fout<<i<<": ";
        for (j=1; j<=n; j++)
            fout<<Mat[i][j]<<" ";
        fout<<'\n';
    }*/
    Afisare();
    return 0;
}

void Citire()
{
    int i, x, y, c;
    fin>>n>>m>>f>>caz;
    for (i=1; i<=m; i++)
    {
        fin>>x>>y>>c;
        A[x][0].val++;
        A[x][A[x][0].val].val = y;
        A[x][A[x][0].val].cost = c;
        A[y][0].val++;
        A[y][A[y][0].val].val = x;
        A[y][A[y][0].val].cost = c;
    }
    for (i=1; i<=f; i++)
    {
        fin>>x>>y>>c;
        Amenda[x][y]+=c;
    }
}

void PD()
{
    int i, j, k, p, cc;
    long long maxim;
    // init 0 si -1
    for (i=0; i<T; i++)
        for (j=1; j<=n; j++)
            Mat[i][j]=(-1);
    Mat[0][1]=0;
    for (i=1; i<T; i++)
    {
        for (j=1; j<=n; j++)
        {
            maxim=-1;
            for (k=1; k<=A[j][0].val; k++)
            {
                p=A[j][k].val;
                cc=A[j][k].cost;
                if (i>=cc)
                    if (Mat[i-cc][p]>maxim)
                        maxim=Mat[i-cc][p];
            }
            if (maxim>Mat[i-1][j])
                Mat[i][j]=maxim;
            else
                Mat[i][j]=Mat[i-1][j];
            if (Mat[i][j]>=0)
                Mat[i][j]+=Amenda[j][i];
        }
    }
}

void Afisare()
{
    int i, x, y;
    for (i=1; i<=caz; i++)
    {
        fin>>x>>y;
        fout<<Mat[y][x]<<'\n';
    }
}