Cod sursa(job #1009622)

Utilizator visanrVisan Radu visanr Data 13 octombrie 2013 16:21:51
Problema Amenzi Scor 0
Compilator cpp Status done
Runda xxx Marime 1.94 kb
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

const int NMAX = 155, TMAX = 3505;

int N, M, K, P, A, B, C, Best[NMAX][TMAX], Cost[NMAX][NMAX], Sum[NMAX][TMAX];
vector<int> G[NMAX];
bool InQueue[NMAX][TMAX];
 
 
void GetMax()
{
    for(int i = 0; i < NMAX; ++ i)
        for(int j = 0; j < TMAX; ++ j)
            Best[i][j] = -1;
            
    queue<pair<int, int> > Q;
    Q.push(make_pair(1, 0));
    Best[1][0] = Sum[1][0];
    
    while(!Q.empty())
    {
        int Node = Q.front().first, Time = Q.front().second;
        Q.pop();
        if(Time > TMAX) continue;
        
        InQueue[Node][Time] = 0;
        for(vector<int> :: iterator it = G[Node].begin(); it != G[Node].end(); ++ it)
            if(Best[Node][Time] + Sum[*it][Time + Cost[Node][*it]] > Best[*it][Time + Cost[Node][*it]])
            {
                Best[*it][Time + Cost[Node][*it]] = Best[Node][Time] + Sum[*it][Time + Cost[Node][*it]];
                if(!InQueue[*it][Time + Cost[Node][*it]])
                    InQueue[*it][Time + Cost[Node][*it]] = 1, Q.push(make_pair(*it, Time + Cost[Node][*it]));
            }
    }
}

int main()
{
    freopen("amenzi.in", "r", stdin);
    freopen("amenzi.out", "w", stdout);
    
    scanf("%i %i %i %i", &N, &M, &K, &P);
    for(int i = 1; i <= M; ++ i)
    {
        scanf("%i %i %i", &A, &B, &C);
        Cost[A][B] = max(Cost[A][B], C);
        Cost[B][A] = max(Cost[B][A], C);
        G[A].push_back(B);
        G[B].push_back(A);
    }
    for(int i = 1; i <= N; ++ i)
    {
        Cost[i][i] = 1;
        G[i].push_back(i);
    }
    
    for(int i = 1; i <= K; ++ i)
    {
        scanf("%i %i %i", &A, &B, &C);
        Sum[A][B] += C;
    }
    
    GetMax();
    for(int i = 1; i <= P; ++ i)
    {
        scanf("%i %i", &A, &B);
        printf("%i\n", Best[A][B]);
    }
    
    return 0;
}