Pagini recente » Cod sursa (job #690596) | Cod sursa (job #1580575) | Cod sursa (job #3283927) | Cod sursa (job #1131475) | Cod sursa (job #1009627)
Utilizator |
Visan Radu visanr |
Data |
13 octombrie 2013 16:30:03 |
Problema |
Amenzi |
Scor |
0 |
Compilator |
cpp |
Status |
done |
Runda |
xxx |
Marime |
1.89 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] = 0;
while(!Q.empty())
{
int Node = Q.front().first, Time = Q.front().second;
Q.pop();
InQueue[Node][Time] = 0;
for(vector<int> :: iterator it = G[Node].begin(); it != G[Node].end(); ++ it)
if(Time + Cost[Node][*it] < TMAX && Best[Node][Time] + Sum[Node][Time] > Best[*it][Time + Cost[Node][*it]])
{
Best[*it][Time + Cost[Node][*it]] = Best[Node][Time] + Sum[Node][Time];
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;
}