Cod sursa(job #1855436)

Utilizator alexandruchiriacAlexandru Chiriac alexandruchiriac Data 23 ianuarie 2017 17:35:13
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>


#define NRMAX 1001
#define pb push_back
using namespace std;

ifstream f("maxflow.in");
ofstream g("maxflow.out");

int capacity[NRMAX][NRMAX] , flow[NRMAX][NRMAX];
int n , m , x , y , c , flowt , maxflow;
vector < int > graph[NRMAX];
queue < int > Q;
bool used[NRMAX];
int tata[NRMAX];

int bfs ()
{
    for(int i = 1; i <= n ; i++ ) used[i] = 0;
    Q.push(1);
    used[1] = 1;
    int gasit = 0;
    while ( !Q.empty() )
    {
        int nod = Q.front();
        Q.pop();
        if ( nod == n )
        {
            gasit = 1;
            continue;
        }
        for ( int i = 0 ; i < graph[nod].size(); i++ )
        {
            int vecin = graph[nod][i];
            if ( !used[vecin] and capacity[nod][vecin] > flow[nod][vecin] )
            {
                used[vecin] = 1;
                tata[vecin] = nod;
                Q.push(vecin);
            }
        }
    }
    return gasit;
}


int main()
{
    f >> n >> m;
    for ( ; m-- ; )
    {
        f >> x >> y >> c;
        capacity[x][y] += c;
        graph[x].pb(y);
        graph[y].pb(x);
    }
    for ( ; bfs();  )
    {
        for ( int i = 0 ; i < graph[n].size(); i++ )
        {
            int vecin = graph[n][i];
            tata[n] = vecin;
            if ( !used[vecin] or capacity[vecin][n] == flow[vecin][n] ) continue;
            int minim = 9999999;
            for ( int start = n ; start != 1; start=tata[start] )
            {
                minim = min(minim, capacity[tata[start]][start] - flow[tata[start]][start]);
            }
            if ( minim == 0 ) continue;
            maxflow += minim;
            for ( int start = n ; start != 1; start=tata[start] )
            {
                flow[tata[start]][start] += minim;
                flow[start][tata[start]] -= minim;
            }
        }
    }
    g << maxflow;
    return 0;
}