Pagini recente » Cod sursa (job #382846) | Cod sursa (job #2392195) | Cod sursa (job #1543437) | Cod sursa (job #2855025) | Cod sursa (job #1009668)
Utilizator |
Visan Radu visanr |
Data |
13 octombrie 2013 17:06:53 |
Problema |
Amenzi |
Scor |
40 |
Compilator |
cpp |
Status |
done |
Runda |
xxx |
Marime |
2.22 kb |
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <queue>
#include <algorithm>
#include <cctype>
using namespace std;
const int NMAX = 155, TMAX = 3505, INF = 0x3f3f3f3f;
int N, M, K, P, A, B, C, Best[NMAX][TMAX], Sum[NMAX][TMAX], Cost[NMAX][NMAX];
vector<int> G[NMAX];
void GetMax()
{
for(int i = 0; i < NMAX; ++ i)
for(int j = 0; j < TMAX; ++ j)
Best[i][j] = -1;
Best[1][0] = 0;
for(int j = 0; j < TMAX; ++ j)
for(int i = 1; i <= N; ++ i)
{
if(Best[i][j] == -1) continue;
for(vector<int> :: iterator it = G[i].begin(); it != G[i].end(); ++ it)
{
int Nextj = j + Cost[i][*it];
if(Nextj < TMAX)
Best[*it][Nextj] = max(Best[*it][Nextj], Best[i][j] + Sum[*it][Nextj]);
}
}
}
const int MaxB = 1000000;
char Buf[MaxB];
int Ptr;
inline int GetInt()
{
int Ans = 0;
while(!isdigit(Buf[Ptr]))
if(++ Ptr >= MaxB)
fread(Buf, 1, MaxB, stdin), Ptr = 0;
while(isdigit(Buf[Ptr]))
{
Ans = Ans * 10 + Buf[Ptr] - '0';
if(++ Ptr >= MaxB)
fread(Buf, 1, MaxB, stdin), Ptr = 0;
}
return Ans;
}
int main()
{
freopen("amenzi.in", "r", stdin);
freopen("amenzi.out", "w", stdout);
N = GetInt();
M = GetInt();
K = GetInt();
P = GetInt();
for(int i = 1; i <= N; ++ i)
for(int j = 1; j <= N; ++ j)
Cost[i][j] = INF;
for(int i = 1; i <= M; ++ i)
{
A = GetInt();
B = GetInt();
C = GetInt();
Cost[A][B] = min(Cost[A][B], C);
Cost[B][A] = min(Cost[B][A], C);
G[A].push_back(B);
G[B].push_back(A);
}
for(int i = 1; i <= N; ++ i)
Cost[i][i] = min(Cost[i][i], 1), G[i].push_back(i);
for(int i = 1; i <= K; ++ i)
{
A = GetInt();
B = GetInt();
C = GetInt();
Sum[A][B] += C;
}
GetMax();
for(int i = 1; i <= P; ++ i)
{
A = GetInt();
B = GetInt();
printf("%i\n", Best[A][B]);
}
return 0;
}