Cod sursa(job #600331)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 1 iulie 2011 13:20:16
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <cstdio>
#include <vector>

using namespace std;

vector <pair <int,int> > g[151];
int a[151][3501],d[151][3501],qn[8001],qt[8001];

int main()
{
    int i,j,k,n,m,p,x,y,z,tmax=0;
    vector <pair <int,int> >::iterator it;
    freopen("amenzi.in","r",stdin);
    freopen("amenzi.out","w",stdout);
    scanf("%d %d %d %d\n",&n,&m,&k,&p);
    for (i=1;i<=m;++i)
    {
        scanf("%d %d %d",&x,&y,&z);
        g[x].push_back(make_pair(y,z));
        g[y].push_back(make_pair(x,z));
    }
    for (i=1;i<=k;++i)
    {
        scanf("%d %d %d",&x,&y,&z);
        a[x][y]+=z;
    }
    for (i=1;i<=p;++i)
    {
        scanf("%d %d",&qn[i],&qt[i]);
        if (qt[i]>tmax)
            tmax=qt[i];
    }
    for (i=2;i<=n;++i)
        d[i][0]=-2000000000;
    for (i=1;i<=tmax;++i)
        for (j=1;j<=n;++j)
        {
            d[j][i]=d[j][i-1]+a[j][i];
            for (it=g[j].begin();it!=g[j].end();++it)
                if (it->second<=i&&d[it->first][i-it->second]+a[j][i]>d[j][i])
                    d[j][i]=d[it->first][i-it->second]+a[j][i];
        }
    for (i=1;i<=p;++i)
        if (d[qn[i]][qt[i]]<0)
            printf("-1\n");
        else
            printf("%d\n",d[qn[i]][qt[i]]);
    return 0;
}