Cod sursa(job #369620)

Utilizator DraStiKDragos Oprica DraStiK Data 28 noiembrie 2009 22:36:23
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <algorithm>
#include <vector>
using namespace std;

#define pb push_back
#define mp make_pair
#define MAX 3505
#define DIM 155

vector <pair <int,int> > lst[DIM];
int best[DIM][MAX],crime[DIM][MAX];
int n,m,k,p;

void read ()
{
    int i,x,y,z;

    scanf ("%d%d%d%d",&n,&m,&k,&p);
    for (i=1; i<=m; ++i)
    {
        scanf ("%d%d%d",&x,&y,&z);
        lst[x].pb (mp (y,z));
        lst[y].pb (mp (x,z));
    }
    for (i=1; i<=k; ++i)
    {
        scanf ("%d%d%d",&x,&y,&z);
        crime[x][y]+=z;
    }
}

void solve ()
{
    vector <pair <int,int> > :: iterator it;
    int i,j;

    memset (best,-1,sizeof (best));
    best[1][0]=crime[1][0];
    for (i=1; i<MAX; ++i)
        for (j=1; j<=n; ++j)
        {
            best[j][i]=best[j][i-1];
            for (it=lst[j].begin (); it!=lst[j].end (); ++it)
                if (it->second<=i)
                    best[j][i]=max (best[j][i],best[it->first][i-it->second]);
            if (crime[j][i] && best[j][i]!=-1)
                best[j][i]+=crime[j][i];
        }
}

void print ()
{
    int i,x,y;

    for (i=1; i<=p; ++i)
    {
        scanf ("%d%d",&x,&y);
        if (best[x][y]!=-1)
            printf ("%d\n",best[x][y]);
        else
            printf ("0\n");
    }
}

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

    read ();
    solve ();
    print ();

    return 0;
}