Cod sursa(job #1087574)

Utilizator mazaandreiAndrei Mazareanu mazaandrei Data 19 ianuarie 2014 16:29:51
Problema Amenzi Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include<fstream>
#include<vector>
using namespace std;
ifstream in("amenzi.in"); ofstream out("amenzi.out");
struct arc{
    int nod,cost;
};
vector <arc> l[151];
int a[3505][151],b[3505][151];
int n,m,p,k,x,y,t,v,c;
int main(){
    in>>n>>m>>k>>p;
    for(int i=1;i<=m;++i){
        in>>x>>y>>c;
        l[x].push_back((arc){y,c});
        l[y].push_back((arc){x,c});
    }
    for(int i=1;i<=k;++i){
        in>>x>>t>>v;
        b[t][x]+=v; //in nodul x la momentul t are loc o infractiune
    }
    for(int i=0;i<=3501;++i) for(int j=0;j<=n;++j) a[i][j]=-1;
    a[0][1]=b[0][1]; //Daca la timpul 0 am o infractiune in punctul de start, vine garcea si amendeaza
    for(int i=1;i<=3501;++i){ //pentru fiecare moment de timp
        for(int j=1;j<=n;++j){ //pentru fiecare nod in parte
            for(vector <arc> :: iterator it=l[j].begin(); it!=l[j].end(); ++it){
                if(i-(*it).cost>=0) //vad daca as fi putut ajunge in nodul curent din alt nod vecin
                    a[i][j]=max(a[i][j],a[i-(*it).cost][(*it).nod]); //si vad exact din care vecin a venit
            }
            if( a[i][j]!=-1) a[i][j]+=b[i][j]; //daca sa putut ajunge aici, dau si amenda respectiva

        }
    }
    //a[i][j] va fi deci amenda totala maxima data in timpul i, terminand in nodul j
    for(int i=1;i<=p;++i){
        in>>x>>y;
        out<<a[y][x]<<'\n';
    }
}