Cod sursa(job #1239335)

Utilizator heracleRadu Muntean heracle Data 8 octombrie 2014 19:35:17
Problema Amenzi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <cstdio>
#include <algorithm>
FILE* in=fopen("amenzi.in","r");
FILE* out=fopen("amenzi.out","w");
const int T=3507,N=152, K=12004;
int mat[N][N];
int n,m,k,p;
int v[T][N];
/*
struct infract
{
    int t,nod,c;
} infr[K];
*/
int amenda[T][N];
void ROY()
{
    for(int k=1; k<=n; k++)
    {
        for(int i=1; i<=n; i++)
        {
            for(int j=i+1; j<=n; j++)
            {
                if(mat[i][j]> mat[i][k]+mat[k][j])
                {
                    mat[i][j]=mat[i][k]+mat[k][j];
                    mat[j][i]=mat[i][k]+mat[k][j];
                }
            }
        }
    }
}
int main()
{
    fscanf(in,"%d %d %d %d",&n,&m,&k,&p);
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=n; j++)
            mat[i][j]=T;
        mat[i][i]=0;
    }
    int a,b,c;
    for(int i=1; i<=m; i++)
    {
        fscanf(in,"%d %d %d",&a,&b,&c);
        mat[a][b]=c;
        mat[b][a]=c;
    }
    for(int i=1; i<=k; i++)
    {
        fscanf(in,"%d %d %d",&a,&b,&c);
        amenda[b][a]=c;
    }
    ROY();
    int max;
    v[0][1]=amenda[0][1];
    for(int t=1; t<=3500; t++)
    {
        for(int i=1; i<=n; i++)
        {
            max=v[t-1][i];

            if(t-mat[i][1]<0)
                continue;

            for(int j=1; j<=n; j++)
            {
                if(t-mat[i][j]>=0 && max<v[ t-mat[i][j] ][j]+amenda[t][i])
                    max=v[t-mat[i][j]][j]+amenda[t][i];
            }
            v[t][i]=max;
        }
    }
    int t,nod;
    for(int i=1; i<=p; i++)
    {
        fscanf(in,"%d %d",&nod,&t);
        if(mat[i][nod]>t)
            fprintf(out,"-1\n");
        else
            fprintf(out,"%d\n",v[t][nod]);
    }
    return 0;
}