Cod sursa(job #2092782)

Utilizator stefdascalescuStefan Dascalescu stefdascalescu Data 22 decembrie 2017 12:19:29
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include<bits/stdc++.h>
#define NMAX 1024
#define INF 1000000000
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int C[NMAX][NMAX],flow,F[NMAX][NMAX],TT[NMAX];
/// C - Capacitatea
/// F - Fluxul
/// F[i][j]<=C[i][j]
/// TT - Tatal
vector<int>v[NMAX];
int N,M,cd[NMAX]; /// cd - coada
bool viz[NMAX]; /// vizitatii
int bfs()
{
    cd[0]=cd[1]=1;
    memset(viz, 0, sizeof(viz));
    viz[1] = 1;
    for (int i=1;i<=cd[0];i++)
    {
        int nod = cd[i];
        if (nod == N)
            continue;
        for (int j = 0; j < v[nod].size(); j++)
        {
            int V = v[nod][j];
            if (C[nod][V] == F[nod][V] || viz[V])
                continue;
            viz[V] = 1;
            cd[++cd[0]] = V;
            TT[V] = nod;
        }
    }
    return viz[N];
}
int main()
{
    f>>n>>m;
    for (int i=1;i<=m;++i)
    {
        int x,y,z;
        f>>x>>y>>z;
        C[x][y]+=z;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    for (flow = 0; bfs();)
        for (int i=0;i<v[N].size();i++)
        {
            int nod=v[N][i];
            if (F[nod][N] == C[nod][N] || !viz[nod])
                continue;
            TT[N] = nod;
            int fmin = INF;
            for (nod = N; nod != 1; nod=TT[nod])
            {
                int R=TT[nod];
                fmin=min(fmin,C[R][nod]-F[R][nod]);
            }
            if (fmin == 0)
                continue;
            for (nod = N; nod != 1; nod = TT[nod])
            {
                int R=TT[nod];
                F[R][nod]+=fmin;
                F[nod][R]-=fmin;
            }
            flow+=fmin;
        }
    g<<flow;
    return 0;
}