Cod sursa(job #1826418)

Utilizator UMihneaUngureanu Mihnea UMihnea Data 10 decembrie 2016 13:57:56
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
#include <vector>
#include <bitset>
#include <queue>

using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
const int N = 1002;
int n,m,x,y,z,F[N][N],C[N][N],BF(),flow_now,max_flow,dad[N],i,j;
bitset<N> viz;
vector<int> v[N];
queue<int>Q;
int main()
{
    f>>n>>m;
    for(;m;m--)
    {
        f>>x>>y>>z;
        C[x][y]=z;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    while(BF())
    {
        for(i=1;i<=n;i++)
            if(viz[i]&&C[i][n]-F[i][n])
            {
                flow_now=C[i][n]-F[i][n];
                dad[n]=i;
                for(j=n;j>1&&flow_now;j=dad[j])
                    flow_now=min(flow_now,C[dad[j]][j]-F[dad[j]][j]);
                if(flow_now)
                {
                    max_flow+=flow_now;
                    for(j=n;j>1;j=dad[j])
                        F[dad[j]][j]+=flow_now,F[j][dad[j]]-=flow_now;
                }

            }
    }
    g<<max_flow;
    return 0;
}
int BF()
{
    viz.reset();
    Q.push(1);
    viz[1]=1;
    while(Q.size())
    {
        int nod=Q.front();
        Q.pop();
        for(auto vec: v[nod])
            if(!viz[vec]&&C[nod][vec]-F[nod][vec])
            {
                viz[vec]=1;
                dad[vec]=nod;
                Q.push(vec);

            }
    }
    return viz[n];
}