Cod sursa(job #1134516)

Utilizator lianaliana tucar liana Data 6 martie 2014 17:59:48
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include<stdio.h>
#include<vector>
using namespace std;
#define nmax 155
#define pmax 8005
#define tmax 3505
struct element{int n, t;};
int n, m, k, p, a, b, t, i, nod, mom, val, tpmax;
vector <element> ma[nmax];
vector <element> ::iterator it;
element vs[pmax], el;
int smax[tmax][nmax], am[tmax][nmax];

void citire()
{
    scanf("%ld %ld %ld %ld",&n,&m,&k,&p);
    for (i=1;i<=m;i++)
    {
        scanf("%ld %ld %ld",&a,&b,&t);
        el.n=b; el.t=t;
        ma[a].push_back(el);
        el.n=a;
        ma[b].push_back(el);
    }
    for (i=1;i<=k;i++)
    {
        scanf("%ld %ld %ld",&nod,&mom,&val);
        am[mom][nod]+=val;
    }
    for (i=1;i<=p;i++)
    {
        scanf("%ld %ld",&vs[i].n,&vs[i].t);
        if (tpmax<vs[i].t)
            tpmax=vs[i].t;
    }
}

void rezolvare()
{
    smax[0][1]=1;
    for (t=1;t<=tpmax;t++)
    {
        for (nod=1;nod<=n;nod++)
        {
            if (smax[t-1][nod]>0)
                smax[t][nod]=smax[t-1][nod];
            for (it=ma[nod].begin();it!=ma[nod].end();it++)
                if (t>=(*it).t)
                    if (smax[t-(*it).t][(*it).n]>smax[t][nod])
                        smax[t][nod]=smax[t-(*it).t][(*it).n];
            if (smax[t][nod]>0)
                smax[t][nod]+=am[t][nod];
        }
    }
}

void afisare()
{
    for (i=1;i<=p;i++)
        printf("%ld\n",smax[vs[i].t][vs[i].n]-1);
}

int main()
{
    freopen("amenzi.in","r",stdin);
    freopen("amenzi.out","w",stdout);
    citire();
    rezolvare();
    afisare();
    return 0;
}