Cod sursa(job #2686326)

Utilizator AndreiDeltaBalanici Andrei Daniel AndreiDelta Data 18 decembrie 2020 21:56:54
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <bits/stdc++.h>
#define pb push_back
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
const int dim=1e3+10;
const int inf=2e9;
typedef long long ll;
typedef pair<int,int> pi;
int t,n,m,a,b,c,ans;

vector < vector < int >  > C(dim,vector < int > (dim,0));
vector < int > V[dim],viz(dim,0),T(dim,0);

void init()
{
    for(int i=1;i<=n;i++)
        viz[i]=0,
        T[i]=0;
}

bool BFS()
{
    queue < int > qu;
    qu.push(1);
    viz[1]=1;
    while(!qu.empty() && viz[n]!=2)
    {
        int nod=qu.front();
        qu.pop();
        viz[nod]=2;
        for(unsigned int vecin:V[nod])
        if(!viz[vecin] && C[nod][vecin] > 0)
        {
            T[vecin]=nod;
            qu.push(vecin);
        }
    }

    return (viz[n]==2);
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    f>>n>>m;
    for(int i=1;i<=m;i++)
    {
        f>>a>>b>>c;
        V[a].pb(b);
        V[b].pb(a);
        C[a][b]=c;
    }
    while(BFS())
    {
        for(unsigned int x:V[n])
        {
            T[n]=x;
            if(viz[x]==2 && C[x][n]>0)
            {
                int minim=inf;
                int y=n;
                while(T[y]!=0)
                {
                    minim=min(minim,C[T[y]][y]);
                    y=T[y];
                }
                y=n;
                while(T[y]!=0)
                {
                    C[T[y]][y]-=minim;
                    C[y][T[y]]+=minim;
                    y=T[y];
                }
                ans+=minim;
            }
        }
        init();
    }
    g<<ans<<'\n';


    return 0;
}