Cod sursa(job #2566177)

Utilizator AndreiDeltaBalanici Andrei Daniel AndreiDelta Data 2 martie 2020 19:19:36
Problema Flux maxim Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
#include <bits/stdc++.h>
#define Dim 1001
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
typedef long long ll;
int N,M,T[Dim];
int a,b,c,C[Dim][Dim],flow;
int viz[Dim];


vector < int > V[Dim];

bool BFS()
{
    queue < int >  qu;


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

    viz[1]=1;
    qu.push(1);
    T[1]=0;

    while(!qu.empty())
    {
        int nod=qu.front();
        qu.pop();

        viz[nod]=2;

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

    if( viz[N]!=2 ) return false;
    return true;
}

int main()
{
    f>>N>>M;
    for(int i=1;i<=M;i++)
    {
        f>>a>>b>>c;
        C[a][b]=c;
        V[a].push_back(b);
        V[b].push_back(a);
    }

    while( BFS() )
    {
        for(unsigned  int i=0;i<V[N].size();i++)
        {
            int vecin=V[N][i];
            T[N]=vecin;

            if( viz[vecin] == 2 && C[vecin][N] >= 0 )
            {
                int minim=INT_MAX;

                int start=N;
                while( T[start] )
                {
                    minim=min(minim,C[T[start]][start]);
                    start=T[start];
                }

                flow+=minim;

                start=N;

                while( T[start] )
                {
                    C[T[start]][start]-=minim;
                    C[start][T[start]]+=minim;
                    start=T[start];
                }
            }
        }
    }
    g<<flow;

    return 0;
}