Cod sursa(job #2520558)

Utilizator AndreiDeltaBalanici Andrei Daniel AndreiDelta Data 9 ianuarie 2020 15:30:38
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <bits/stdc++.h>
#define Dim 1001
#define Max 110000
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");// 0 nedescoperit-0  examinat-1 aruncat-2

typedef pair < int,int > pi;
vector < pi > V[Dim];

int N,M,x,y,z,C[Dim][Dim];
long long flow;
bool viz[Dim];

bool BFS(int tata[])
{
    queue <int> qu;
    for(int i=1;i<=N;i++) tata[i]=-1,viz[i]=0;

    viz[1]=1;
    tata[1]=-1;
    qu.push(1);

    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].first;
            int cost=V[nod][i].second;

            if( viz[vecin]==0 && C[nod][vecin] > 0 )
            {
                viz[vecin]=1;
                tata[vecin]=nod;
                qu.push(vecin);
            }
        }
    }
    if( !viz[N] ) return 0;
    return 1;
}

int main()
{
    f>>N>>M;
    for(int i=1;i<=M;i++)
    {
        f>>x>>y>>z;
        V[x].push_back({y,z});
        V[y].push_back({x,z});
        C[x][y]=z;

    }

    int tata[Dim];
    while( BFS(tata) )
    {

                int minim=Max;
                int nod_cur=N;
                while( tata[nod_cur] != -1 )
                {
                    minim=min(minim,C[ tata[ nod_cur ] ][ nod_cur ] );
                    nod_cur=tata[nod_cur];
                }
                nod_cur=N;
                while( tata[ nod_cur ] != -1 )
                {
                    C[ tata[ nod_cur ] ][ nod_cur ]-=minim;
                    C[ nod_cur ][ tata[ nod_cur ] ]+=minim;
                    nod_cur=tata[nod_cur];
                }
                flow+=minim;


    }

    g<<flow;

    return 0;
}