Cod sursa(job #2109153)

Utilizator MithrilBratu Andrei Mithril Data 19 ianuarie 2018 11:11:38
Problema Amenzi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <bits/stdc++.h>
#define N 155
#define K 12005
#define M 1505
#define T 3505
using namespace std;

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

struct Edge
{
    int nod;
    int cost;
};

struct State{
    int nod;
    int timp;
    int suma;
};

vector<Edge> graf[N];
int amenzi[N][T];
int dp[N][T];
bitset<T> inQueue[N];
queue<State> Q;
int n,m,k,p;
int timp_max=INT_MIN;
vector<pair<int, int> > nevasta;

void bellman()
{
    Q.push(State{1,0,0});
    dp[1][0]=0;
    inQueue[1][0]=1;

    while(Q.size())
    {
        State stare = Q.front();
        Q.pop();
        inQueue[stare.nod][stare.timp]=0;

        int nodC = stare.nod;
        int sumC = stare.suma;
        int timpC = stare.timp;

        sumC += amenzi[nodC][timpC];

        dp[nodC][timpC] = max(dp[nodC][timpC],sumC);

        for(auto q:graf[nodC])
        {
            int vecin = q.nod;
            int cost = q.cost;

            if(timpC+cost<=timp_max)
            {
                if(!inQueue[vecin][timpC+cost])
                {
                    inQueue[vecin][timpC+cost]=1;
                    Q.push(State{vecin,timpC+cost,sumC});
                }
            }
        }
    }
}

int main()
{
    fin>>n>>m>>k>>p;
    for(int i=1;i<=m;i++)
    {
        int a,b,c;
        fin>>a>>b>>c;
        graf[a].push_back(Edge{b,c});
        graf[b].push_back(Edge{a,c});
    }
    for(int i=1;i<=n;i++)
    {
        graf[i].push_back(Edge{i,1});
    }
    for(int i=0;i<N;i++) for(int j=0;j<T;j++) dp[i][j]=INT_MIN;
    for(int i=1;i<=k;i++)
    {
        int a,b,c;
        fin>>a>>b>>c;
        amenzi[a][b]=c;
    }

    for(int i=1;i<=p;i++)
    {
        int a,b;
        fin>>a>>b;
        nevasta.push_back(make_pair(a,b));
        timp_max=max(timp_max, b);
    }
    bellman();
    for(auto q:nevasta)
    {
        int nod=q.first;
        int t=q.second;
        fout<<( (dp[nod][t] != INT_MIN ) ? dp[nod][t]:-1)<<'\n';
    }
    return 0;
}