Cod sursa(job #2579558)

Utilizator MaraPMara P MaraP Data 12 martie 2020 16:41:38
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define MAXN 1005
#define INF 0x3f3f3f3f
#define MAXM 5005
using namespace std;

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

vector<int> G[MAXN];
int Flow[MAXN][MAXN];
int Capacity[MAXN][MAXN];
int n,m;
int viz[MAXN];
int daddy[MAXN];

void resetViz()
{
    for(int i=1;i<=n;i++)
        viz[i]=0;
}
int BFS()
{
    queue<int> Q;
    Q.push(1);
    resetViz();
    viz[1]=1;
    while(!Q.empty())
    {
        int nod=Q.front();
        Q.pop();
        if(nod==n)
            continue;
        for(auto &x:G[nod])
        {
            if(Flow[nod][x]==Capacity[nod][x]||viz[x])
                continue;
            viz[x]=1;
            Q.push(x);
            daddy[x]=nod;
        }
    }
    return viz[n];
}
void read()
{
    fin>>n>>m;
    for(int q=0;q<m;q++)
    {
        int x,y,c;
        fin>>x>>y>>c;
        Capacity[x][y]+=c;
        G[x].push_back(y);
        G[y].push_back(x);
    }
    int maxFlow=0;
    while(BFS())
    {
        for(auto &x:G[n])
        {
            if(Flow[x][n]==Capacity[x][n]||!viz[x])
                continue;
            daddy[n]=x;
            int minFlow=INF;
            for(int nod=n;nod!=1;nod=daddy[nod])
                minFlow=min(minFlow, Capacity[daddy[nod]][nod]-Flow[daddy[nod]][nod]);
            if(minFlow==0)
                continue;
            for(int nod=n;nod!=1;nod=daddy[nod])
                Flow[daddy[nod]][nod]+=minFlow, Flow[nod][daddy[nod]]-=minFlow;
            maxFlow+=minFlow;
        }
    }
    fout<<maxFlow;
}
int main()
{
    read();
    return 0;
}