Cod sursa(job #2406124)

Utilizator 12222Fendt 1000 Vario 12222 Data 15 aprilie 2019 13:31:50
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>

using namespace std;

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

const int Nmax=1005;

int n,m;
int C[Nmax][Nmax],F[Nmax][Nmax],T[Nmax];
vector<int>L[Nmax];
bitset<Nmax>viz;
queue<int>q;

int Bfs()
{
    viz.reset();
    q.push(1);

    int nod;
    while(!q.empty())
    {
        nod=q.front();
        q.pop();
        viz[nod]=1;

        for(auto i:L[nod])
            if(!viz[i] && F[nod][i]<C[nod][i])
            {
                T[i]=nod;
                q.push(i);
            }
    }

    return viz[n];
}

void Flex()
{
    int minflow,maxflow;

    maxflow=0;
    while(Bfs())
    {
        for(auto i:L[n])
            if(viz[i])
            {
                minflow=C[i][n]-F[i][n];
                for(int nod=i;nod!=1;nod=T[nod])
                    minflow=min(minflow,C[T[nod]][nod]-F[T[nod]][nod]);

                if(!minflow)continue;

                F[i][n]+=minflow;
                F[n][i]-=minflow;

                for(int nod=i;nod!=1;nod=T[nod])
                {
                    F[T[nod]][nod]+=minflow;
                    F[nod][T[nod]]-=minflow;
                }

                maxflow+=minflow;
            }
    }

    fout<<maxflow<<"\n";
}

int main()
{
    fin>>n>>m;

    int x,y,z;
    for(int i=1;i<=m;i++)
    {
        fin>>x>>y>>z;
        L[x].push_back(y);
        L[y].push_back(x);
        C[x][y]=z;
    }

    Flex();

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