Cod sursa(job #1281212)

Utilizator geniucosOncescu Costin geniucos Data 2 decembrie 2014 22:13:56
Problema Algola Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.64 kb
#include<cstdio>
#include<vector>
#include<queue>

using namespace std;

int N, M, Gata, x[309], y[309], z[309], cod[109][53], A[59];

class graph
{
    public:
    int flux, N, S, D, t[2009];
    char f[5009][5009], c[5009][5009];
    vector < int > muchii[5009];

    void Add_edge (int i, int j, int cost)
    {
        muchii[i].push_back(j);
        muchii[j].push_back(i);
        c[i][j] = cost;
    }

    bool bfs()
    {
        queue < int > q;
        for (int i=1; i<=N; i++)
            t[i] = -1;
        q.push(S);
        t[S] = 0;
        while (!q.empty())
        {
            int nod = q.front();
            q.pop();
            for (vector < int > :: iterator it = muchii[nod].begin(); it != muchii[nod].end(); it++)
                if (t[*it] == -1 && f[nod][*it] < c[nod][*it])
                {
                    t[*it] = nod;
                    if (*it == D) return 1;
                    q.push(*it);
                }
        }
        return 0;
    }

    void calc_flux()
    {
        while ( bfs() )
        {
            for (vector < int > :: iterator it = muchii[D].begin(); it != muchii[D].end(); it++)
                if (t[*it] != -1 && f[*it][D] < c[*it][D])
                {
                    int nod = *it, fmin = 100000;
                    t[D] = nod;
                    for (int i = D; i != S; i = t[i])
                        if (c[t[i]][i] - f[t[i]][i] < fmin)
                            fmin = c[t[i]][i] - f[t[i]][i];
                    flux += fmin;
                    for (int i = D; i != S; i = t[i])
                    {
                        f[t[i]][i] += fmin;
                        f[i][t[i]] -= fmin;
                    }
                }
        }
    }
}graf;

int main()
{
freopen ("algola.in", "r", stdin);
freopen ("algola.out", "w", stdout);

scanf ("%d %d", &N, &M);
for (int i=1; i<=N; i++)
{
    scanf ("%d", &A[i]);
    Gata += A[i];
}
for (int i=1; i<=M; i++)
    scanf ("%d %d %d", &x[i], &y[i], &z[i]);
graf.S = 1;
graf.N = 1;
for (int i=1; i<=100; i++)
    for (int j=1; j<=N; j++)
        cod[i][j] = ++graf.N;
for (int i=1; i<=N; i++)
    graf.Add_edge (graf.S, cod[1][i], A[i]);
for (int i=1; i<100 ;i++)
{
    for (int j=1; j<=M; j++)
    {
        graf.Add_edge (cod[i][x[j]], cod[i+1][y[j]], z[j]);
        graf.Add_edge (cod[i][y[j]], cod[i+1][x[j]], z[j]);
    }
    for (int j=1; j<=N; j++)
        graf.Add_edge (cod[i][j], cod[i+1][j], 100000);
    graf.D = cod[i+1][1];
    graf.calc_flux();
    if (graf.flux == Gata)
    {
        printf ("%d\n", i - 1);
        return 0;
    }
}
return 0;
}