Pagini recente » Cod sursa (job #3195645) | Clasament zombie | Cod sursa (job #1608136) | Cod sursa (job #2081931) | Cod sursa (job #9807)
Cod sursa(job #9807)
#include <stdio.h>
#include <iostream>
#include <map>
#include <vector>
#include <queue>
using namespace std;
#define MAX 160
#define INF 99999999
struct stare {
int nod;
int timp;
int bani;
};
int n, m, k, p;
int a[MAX][MAX];
int nod1, nod2, cc, timp;
map<int, map<int, int> > amen;
int source, dest, meet_time, best = 0;
stare aux;
map<pair<int, double>, bool> caract;
void bfs();
int main()
{
FILE *fin = fopen("amenzi.in", "r");
fscanf(fin, "%d%d%d%d", &n, &m, &k, &p);
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
{
a[i][j] = INF;
if (i == j) a[i][j] = 0;
}
for (int i = 1; i <= m; ++i)
{
fscanf(fin, "%d%d%d", &nod1, &nod2, &cc);
a[nod1][nod2] = cc;
a[nod2][nod1] = cc;
}
for (int i = 1; i <= k; ++i)
{
fscanf(fin, "%d%d%d", &nod1, &timp, &cc);
amen[nod1][timp] = cc;
}
for (int jj = 1; jj <= n; ++jj)
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
if (a[i][j] > a[i][jj] + a[jj][j])
a[i][j] = a[i][jj] + a[jj][j];
FILE *fout = fopen("amenzi.out", "w");
for (int i = 1; i <= p; ++i)
{
source = 1;
best = -1;
fscanf(fin, "%d%d", &dest, &meet_time);
bfs();
fprintf(fout, "%d\n", best);
}
fclose(fin);
fclose(fout);
return 0;
}
void bfs()
{
map<int, int>::iterator start, end;
stare inceput, curr;
inceput.nod = 1;
inceput.timp = 0;
inceput.bani = 0;
queue<stare> Q;
Q.push(inceput);
while (!Q.empty())
{
curr = Q.front(); // am ajuns intr-un nod la un anumit timp cu o anumita cantitate de bani
Q.pop();
for (int i = 1; i <= n; ++i)
if (i != curr.nod)
{
if (curr.timp + a[curr.nod][i] + a[i][dest] <= meet_time)
{
aux.nod = i;
aux.timp = curr.timp + a[curr.nod][i];
aux.bani = curr.bani;
if (!caract.count(make_pair(aux.nod, (double)aux.timp / (double)aux.bani)))
{
Q.push(aux);
caract[make_pair(aux.nod, (double)aux.timp / (double)aux.bani)] = true;
}
}
}
start = amen[curr.nod].begin();
end = amen[curr.nod].end();
for (; start != end; ++start) // verificam toate evenimentele de la acel nod
{
if (curr.timp <= (*start).first) // daca am ajuns inainte sau in acelasi timp cu evenimentul putem aplica amenda
{
if ((*start).first + a[(curr.nod)][dest] <= meet_time) // daca dupa ce am aplicat putem fugi l aintalnire o facem
{
if (best < ((*start).second + curr.bani))
best = ((*start).second + curr.bani); // am fugit cu banii
for (int i = 1; i <= n; ++i) // ne mutam in alt nod
{
if (i != curr.nod && (*start).first + a[(curr.nod)][i] + a[i][dest] <= meet_time) //daca putem merge in alt nod si suntem siguri ca ne mai putem intoarce
{
aux.nod = i;
aux.timp = (*start).first + a[(curr.nod)][i];
aux.bani = (*start).second + curr.bani;
if (!caract.count(make_pair(aux.nod, (double)aux.timp / (double)aux.bani)))
{
Q.push(aux);
caract[make_pair(aux.nod, (double)aux.timp / (double)aux.bani)] = true;
}
}
}
}
}
}
}
}