Cod sursa(job #1390298)

Utilizator Ionut228Ionut Calofir Ionut228 Data 16 martie 2015 22:46:25
Problema Traseu Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.59 kb
#include <fstream>
#include <queue>
#include <vector>
#include <cstring>
#include <algorithm>

using namespace std;

ifstream fin("traseu.in");
ofstream fout("traseu.out");

const int INF = 0x3f3f3f3f;

int N, M, S, D;
int sol;
int grdint[62], grdext[62];
int C[62][62], F[62][62], TT[62], Dmin[62];
vector<pair<int, int> > V[62];
queue<int> Q;
bool inQ[62];

bool bellman()
{
    memset(inQ, false, sizeof(inQ));
    memset(Dmin, INF, sizeof(Dmin));

    Dmin[S] = 0;
    Q.push(S);
    inQ[S] = true;

    while (!Q.empty())
    {
        int now = Q.front();
        Q.pop();
        inQ[now] = false;

        if (now == D)
            continue;

        for (vector<pair<int, int> >::iterator it = V[now].begin(); it != V[now].end(); ++it)
        {
            if (F[now][it->first] < C[now][it->first])
            {
                if (Dmin[now] + it->second < Dmin[it->first])
                {
                    Dmin[it->first] = Dmin[now] + it->second;
                    TT[it->first] = now;
                    if (!inQ[it->first])
                    {
                        Q.push(it->first);
                        inQ[it->first] = true;
                    }
                }
            }
        }
    }

    return (Dmin[D] != INF);
}

int main()
{
    fin >> N >> M;
    S = 0;
    D = N + 1;
    for (int i = 1, nod1, nod2, lg; i <= M; ++i)
    {
        fin >> nod1 >> nod2 >> lg;
        V[nod1].push_back(make_pair(nod2, lg));
        V[nod2].push_back(make_pair(nod1, -lg));
        C[nod1][nod2] = INF;

        ++grdext[nod1];
        ++grdint[nod2];
        sol += lg;
    }
    for (int i = 1; i <= N; ++i)
    {
        if (grdext[i] < grdint[i])
        {
            C[S][i] = grdint[i] - grdext[i];
            V[S].push_back(make_pair(i, 0));
            V[i].push_back(make_pair(S, 0));
        }
        else if (grdext[i] > grdint[i])
        {
            C[i][D] = grdext[i] - grdint[i];
            V[D].push_back(make_pair(i, 0));
            V[i].push_back(make_pair(D, 0));
        }
    }

    int fmin = INF;
    while (bellman())
    {
        fmin = INF;
        for (int nod = D; nod != S; nod = TT[nod])
            fmin = min(fmin, C[TT[nod]][nod] - F[TT[nod]][nod]);
        if (fmin == 0)
            continue;

        for (int nod = D; nod != S; nod = TT[nod])
        {
            F[TT[nod]][nod] += fmin;
            F[nod][TT[nod]] -= fmin;
        }

        sol += fmin * Dmin[D];
    }

    fout << sol << '\n';

    fin.close();
    fout.close();
    return 0;
}