Cod sursa(job #1027808)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 13 noiembrie 2013 09:22:32
Problema Amenzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.39 kb
#include <iostream>
#include <fstream>
#include <vector>
#define NMax 152
#define TMax 3505
#define lim 1000000
#define Next ++position == lim?f.read(buffer, lim), position = 0:0

using namespace std;

int position;
char buffer[lim];
ifstream f ("amenzi.in");
int n, m, nrinfractiuni, nrsotii;
int amenda[TMax][NMax];
struct graph
{
    int node, cost;
    graph() {node = cost = 0;}
    graph(const int _node, const int _cost) {node = _node, cost = _cost;}
};
vector <graph> G[NMax];
int best[TMax][NMax];

inline void Read(int &x)
{
    for (;buffer[position] < '0' || buffer[position] > '9'; Next);
    for (x = 0; '0' <= buffer[position] && buffer[position] <= '9'; x = x*10 + buffer[position] - '0', Next);
}

void Read()
{
    Read(n), Read(m), Read(nrinfractiuni), Read(nrsotii);
    int i, x, y, cost;
    for (i=1; i<=m; ++i)
    {
        Read(x), Read(y), Read(cost);
        G[x].push_back(graph(y, cost));
        G[y].push_back(graph(x, cost));
    }
    for (i=1; i<=nrinfractiuni; ++i)
    {
        Read(x), Read(y), Read(cost);
        amenda[y][x] += cost;
        /**
            la intersectia x se da la timpul y o amenda care costa cost bani
            amenda[y][x] = numarul total de amenzi care se pot da la timpul y la intersectia x
        */
    }
}

void Init()
{
    int i, j;
    for (i=0; i<=3500; ++i)
        for (j=1; j<=n; ++j)
            best[i][j] = -1;
}

void MakeDP()
{
    Init();
    int i, j;
    best[0][1] = amenda[0][1];
    for (i=1; i<=3500; ++i)
    {
        for (j=1; j<=n; ++j)
        {
            best[i][j] = max(best[i][j], best[i-1][j]);
            vector <graph>::iterator it, final;
            graph aux;
            for (it = G[j].begin(), final = G[j].end(); it!=final; ++it)
            {
                aux = *it;
                if (i - aux.cost >= 0)
                    best[i][j] = max(best[i][j], best[i-aux.cost][aux.node]);
            }
            if (best[i][j] == -1)
                continue;
            best[i][j] += amenda[i][j];
        }
    }
}

void Write()
{
    ofstream g("amenzi.out");
    int i, x, y;
    for (i=1; i<=nrsotii; ++i)
    {
        /// se intalneste cu sotia in intersectia x la timpul y
        Read(x), Read(y);
        g<<best[y][x]<<"\n";
    }
    g.close();

}

int main()
{
    Read();
    MakeDP();
    Write();
    return 0;
}