Cod sursa(job #1240125)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 10 octombrie 2014 16:05:28
Problema Amenzi Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <stdio.h>
#define NIL -1
#define MAXN 150
#define MAXT 3500
#define MAXM 1500
int k, d[MAXT+1][MAXN+1], infr[MAXT+1][MAXN+1], next[2*MAXM+1], cost[2*MAXM+1], val[2*MAXM+1], lista[MAXN+1];
inline void adauga(int a, int b, int c){
    k++;
    cost[k]=c;
    val[k]=b;
    next[k]=lista[a];
    lista[a]=k;
}
int main(){
    int a, b, c, n, m, p, q, i, j;
    FILE *fin, *fout;
    fin=fopen("amenzi.in", "r");
    fout=fopen("amenzi.out", "w");
    fscanf(fin, "%d%d%d%d", &n, &m, &p, &q);
    k=0;
    for(i=0; i<m; i++){
        fscanf(fin, "%d%d%d", &a, &b, &c);
        adauga(a, b, c);
        adauga(b, a, c);
    }
    for(i=0; i<p; i++){
        fscanf(fin, "%d%d%d", &a, &b, &c);
        infr[b][a]+=c;
    }
    for(i=2; i<=n; i++){
        d[0][i]=NIL;
    }
    d[0][1]=infr[0][1];
    for(i=1; i<=MAXT; i++){
        for(j=1; j<=n; j++){
            if(d[i-1][j]==NIL){
                d[i][j]=NIL;
            }else{
                d[i][j]=d[i-1][j]+infr[i][j];
            }
            p=lista[j];
            while(p!=0){
                if((i>=cost[p])&&(d[i-cost[p]][val[p]]!=NIL)&&(d[i][j]<d[i-cost[p]][val[p]]+infr[i][j])){
                    d[i][j]=d[i-cost[p]][val[p]]+infr[i][j];
                }
                p=next[p];
            }
        }
    }
    for(i=0; i<q; i++){
        fscanf(fin, "%d%d", &a, &b);
        fprintf(fout, "%d\n", d[b][a]);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}