Cod sursa(job #1242695)

Utilizator mihail.jianuJianu Mihail mihail.jianu Data 14 octombrie 2014 21:28:27
Problema Amenzi Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
void lol(){
    int i=0;
    i++;
}
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int N=150,T=3500,P=8000,INF=11;
class Edge{
    public:
        int v1,v2,c;
        Edge(){
        }
        Edge(int vv2,int cc){
            v2=vv2;
            c=cc;
        }
        Edge(int vv1,int vv2,int cc){
            v1=vv1;
            v2=vv2;
            c=cc;
        }
};
class Query{
    public:
        int v,t;
};
Query qu[P+1];
vector<Edge>g[N+1];
int d[N+1][T+1];
int n,m,k,p;
int pay[N+1][T+1];
int maxQ=-INF-1;
void initD(){
    int i,j;
    for(i=1;i<=n;i++)
        for(j=0;j<=maxQ;j++)
            d[i][j]=-INF-1;
    d[1][0]=0;
}
void DP(){
    int i,j,i1;
    initD();
    d[1][0]=0;
    for(j=1;j<=maxQ;j++){
        for(i=1;i<=n;i++){
            d[i][j]=d[i][j-1];
            for(i1=0;i1<g[i].size();i1++){
                Edge son=g[i][i1];
                if(j>=son.c)
                    d[i][j]=max(d[i][j],d[son.v2][j-son.c]);
            }
            if(d[i][j]>=0)
                d[i][j]+=pay[i][j];
        }
    }
}
int main(){
    int x,y,z,i;
    freopen("amenzi.in","r",stdin);
    freopen("amenzi.out","w",stdout);
    scanf("%d%d%d%d",&n,&m,&k,&p);
    for(i=1;i<=m;i++){
        scanf("%d%d%d",&x,&y,&z);
        if(x+y==3&&x*y==2)
            lol();
        g[x].push_back(Edge(y,z));
        g[y].push_back(Edge(x,z));
    }
    for(i=1;i<=k;i++){
        scanf("%d%d%d",&x,&y,&z);
        pay[x][y]=z;
    }
    for(i=1;i<=p;i++){
        scanf("%d%d",&qu[i].v,&qu[i].t);
        maxQ=max(qu[i].t,maxQ);
    }
    DP();
    for(i=1;i<=p;i++)
        printf("%d\n",d[qu[i].v][qu[i].t]);
    return 0;
}