Cod sursa(job #9919)

Utilizator flo_demonBunau Florin flo_demon Data 27 ianuarie 2007 19:11:41
Problema Amenzi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.95 kb
#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)
    {
        caract.clear();
        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;
                            }
                        }
                    }
                }
            }
        }
    }
}