Cod sursa(job #2637716)

Utilizator PopescuAndreiAlexandruPopescu Andrei Alexandru PopescuAndreiAlexandru Data 24 iulie 2020 14:37:18
Problema Amenzi Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <cstring>

using namespace std;

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

const int KMAX = 3505;
const int DIM = 155;

struct FinalNodes
{
    int node,time;
}L[8005];

int n,m,k,p,x,y,c,T[DIM][KMAX],F[DIM][KMAX],root,DP[DIM][KMAX];

bool Check[DIM][KMAX];

vector < pair<int,int> > G[DIM];

void Read()
{
    fin>>n>>m>>k>>p;
    while(m--)
    {
        fin>>x>>y>>c;
        G[x].push_back(make_pair(y,c));
        G[y].push_back(make_pair(x,c));
    }
    while(k--)
    {
        fin>>x>>y>>c;
        T[x][y]=c;
    }
    for(int i=1;i<=p;i++)
    {
        fin>>L[i].node>>L[i].time;
        x=L[i].node;
        y=L[i].time;
        F[x][y]=1;
    }
    root=1;
}

void DFS(int node, int time)
{
    DP[node][time]+=T[node][time];
    Check[node][time]=1;
    vector < pair<int,int> > ::iterator it;
    for(it=G[node].begin();it!=G[node].end();it++)
    {
        int next=(*it).first;
        int edgeCost=(*it).second;
        if((DP[node][time]>DP[next][time+edgeCost] || (!DP[next][time+edgeCost])) && (time+edgeCost<=3500))
        {
            DP[next][time+edgeCost]=DP[node][time];
            DFS(next,time+edgeCost);
        }
    }
}

int main()
{
    Read();
    DFS(root,0);
    for(int i=1;i<=p;i++)
    {
        x=L[i].node;
        y=L[i].time;
        if(!Check[x][y])
            fout<<-1<<'\n';
        else
            fout<<DP[x][y]<<'\n';
    }
}