Cod sursa(job #1414502)

Utilizator SpiriFlaviuBerbecariu Flaviu SpiriFlaviu Data 2 aprilie 2015 17:52:33
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include <iostream>
#include <vector>
#include <set>
#include <queue>
#include <algorithm>
#include <string>
#include <fstream>
#include <cctype>
#include <iomanip>
#include <cmath>
#include <cstring>
#include <map>
#include <bitset>
#include <stack>
#define INF 0x3f3f3f

using namespace std;

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

vector<int> V[1001];
bitset<1001> used;
int c[1001][1001], f[1001][1001];
int t[1001];
//stack<int> ST;
int flow;
queue<int> Q;
int n;
int delta;



bool BFS()
{
    used.reset();
    Q.push(1);
    used[1] = true;
    while(!Q.empty())
    {
        int node = Q.front();
        Q.pop();
        for(vector<int>::iterator it = V[node].begin(); it != V[node].end() && node != n; it++)
            if(!used[*it] && c[node][*it] > f[node][*it])
            {
                t[*it] = node;
                Q.push(*it);
                used[*it] = true;
            }
    }
    return used[n];
}

void doFlow()
{
    delta = INF;
    int node = n;
    while(t[node])
    {
        delta = min(delta, c[t[node]][node] - f[t[node]][node]);
        node = t[node];
    }
    if(!delta)
        return;
    node = n;
    while(t[node])
    {
        f[node][t[node]] -= delta;
        f[t[node]][node] += delta;
        node = t[node];
    }
    flow += delta;
}


int main()
{
    int m,x,y;
    fin>>n>>m;
    for(int i = 1; i <= m; i++)
    {
        fin>>x>>y;
        V[x].push_back(y);
        V[y].push_back(x);
        fin>>c[x][y];
    }
    while(BFS())
    {
        for(vector<int>::iterator it = V[n].begin(); it != V[n].end(); it++)
        {

            t[n] = *it;
            if(used[*it] && c[*it][n] > f[*it][n])
                doFlow();
        }
    }
    fout<<flow;
    return 0;
}


//FILE!!!