Cod sursa(job #2754652)

Utilizator AndreiDeltaBalanici Andrei Daniel AndreiDelta Data 26 mai 2021 11:07:56
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.15 kb
#include <bits/stdc++.h>
#define pb push_back
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
typedef long long ll;
typedef pair<int,int> pi;
int t;

const int dim=1e3+10;
int n,m;

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


bool BFS(int s)
{
    queue < int > qu;
    viz[1]=1;
    qu.push(1);
    T[1]=-1;
    while(!qu.empty())
    {
        int nod=qu.front();
        qu.pop();
        viz[nod]=2;

        if(nod==n)
            return true;

        for(int i=0;i<V[nod].size();i++)
        {
            int vecin=V[nod][i].first;
            int cost=V[nod][i].second;
            if(!viz[vecin] && C[nod][vecin]>0)
            {
                T[vecin]=nod;
                qu.push(vecin);
                viz[vecin]=1;
            }
        }
    }
    return false;
}

void init(){

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

}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    f>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int a,b,c;
        f>>a>>b>>c;
        V[a].pb({b,c});  //!!!        !!!//
        V[b].pb({a,c}); //!!!Am construit graful rezidual virtual pentru o munca mai usoara !!!

        C[a][b]=c;
    }

    while(BFS(1)){

        for(pi nod:V[n])
        if(viz[nod.first] && C[nod.first][n]>0) //nodul se afla in arborele constuit de BFS
        {
            T[n]=nod.first;
            int minim=INT_MAX;
            int tata=n;
            while(tata!=1)
            {
                minim=min(minim,C[T[tata]][tata]);
                tata=T[tata];
            }

            tata=n;
            while(tata!=1)
            {
                C[T[tata]][tata]-=minim;
                C[tata][T[tata]]+=minim;


                F[T[tata]][tata]+=minim;
                F[tata][T[tata]]-=minim;


                tata=T[tata];
            }
        }
        init();
    }

    int ans=0;
    for(pi x:V[1])
        ans+=F[1][x.first];
    g<<ans<<'\n';

    return 0;
}