Cod sursa(job #2430594)

Utilizator FlaviusFeteanFetean Flavius FlaviusFetean Data 15 iunie 2019 14:52:43
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <list>
#include <queue>
#include <stack>
#include <fstream>

using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

const int NMAX = 1005, MMAX = 5005;
const int inf = 2147000000;

struct muchie{
int s, d, c, f;
} v[MMAX];

list<int> g[NMAX];
list<int>::iterator it;

int main()
{
    int n, m, x, y, c, i, flow = 0;

    fin >> n >> m;
    for(i = 1; i <= m; i++){
        fin >> x >> y >> c;
        g[x].push_back(i);
        v[i].s = x; v[i].d = y; v[i].c = c;
        g[y].push_back(m + i);
        v[m + i].s = y; v[m + i].d = x;
    }

    do{
        muchie e;
        queue<int> q;
        int pred[NMAX] = {0};

        q.push(1);
        while(!q.empty()){
            x = q.front(); q.pop();
            for(it = g[x].begin(); it != g[x].end(); it++){
                e = v[*it];
                if(pred[e.d] == 0 && e.d != 1 && e.c > e.f){
                    pred[e.d] = *it;
                    q.push(e.d);
                }
            }
        }
        if(pred[n] != 0){
            int plusflow = inf;
            for(i = pred[n]; i != 0; i = pred[v[i].s])
                plusflow = min(plusflow, v[i].c - v[i].f);

            for(i = pred[n]; i != 0; i = pred[v[i].s])
                v[i].f += plusflow, v[m + i].f -= plusflow;
            flow = flow + plusflow;
        }
        else break;

    }while(1);

    fout << flow;

    return 0;
}