Cod sursa(job #2467058)

Utilizator RazvanPanaiteRazvan Panaite RazvanPanaite Data 3 octombrie 2019 17:04:26
Problema Amenzi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("amenzi.in");
ofstream fout("amenzi.out");

const int DMAX=155;
const int TMAX=3505;

struct nume{
    int node,cost;
};

vector <nume> V[DMAX];

int dp[TMAX][DMAX];
bool sepoate[TMAX][DMAX];

int n,m,k,p;

inline bool operator<(nume x,nume y){
    return x.cost>y.cost;
}
inline int maxim(int x,int y){
    if(x>y)
       return x;
    return y;
}

int main(){
    int i,j;
    int x,y,c,val;

    fin>>n>>m>>k>>p;
    for(i=1;i<=m;i++){
        fin>>x>>y>>c;
        V[x].push_back({y,c});
        V[y].push_back({x,c});
    }
    for(i=1;i<=k;i++){
        fin>>x>>y>>c;
        dp[y][x]+=c;
    }
    sepoate[0][1]=true;

    for(i=1;i<=3500;i++)
        for(j=1;j<=n;j++){
            val=-INT_MAX/2;
            for(auto& ii:V[j])
                if(i-ii.cost>=0 && sepoate[i-ii.cost][ii.node])
                   val=maxim(val,dp[i-ii.cost][ii.node]);
            bool ok=false;
            if(val != -INT_MAX/2){
               sepoate[i][j]=true;
               if(sepoate[i-1][j])
                  dp[i][j]+=maxim(val,dp[i-1][j]);
                  else
                  dp[i][j]+=val;
               ok=true;
            }
            if(sepoate[i-1][j]){
               sepoate[i][j]=true;
               if(!ok)
                  dp[i][j]+=dp[i-1][j];
            }
        }

    for(i=1;i<=p;i++){
        fin>>x>>y;
        if(sepoate[y][x])
           fout<<dp[y][x]<<'\n';
           else
           fout<<"-1\n";
    }

    return 0;
}