Cod sursa(job #1410595)

Utilizator Corina1997Todoran Ana-Corina Corina1997 Data 31 martie 2015 10:08:03
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <fstream>
#include <vector>
#include <bitset>
#include <cstring>
#include <queue>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;

ifstream is("maxflow.in");
ofstream os("maxflow.out");

int n, m;
vector<vector<int>> g;
int c[1020][1020];
bitset<1024> v;
queue<int> Q;
int t[1020];

bool BFS(int x, int sink)
{
    v.reset();
    v[x] = 1;
    Q.push(x);
    while(!Q.empty())
    {
        x = Q.front();
        Q.pop();
        if (x == sink)
            continue;
        for(const auto & y : g[x])
        {
            if(!v[y] && c[x][y] > 0)
            {
                v[y] = 1;
                t[y] = x;
                Q.push(y);
            }
        }
    }
    return v[n];
}

int MaxFlow(int source, int sink)
{
    int maxflow = 0;
    int fmin;
    while(BFS(source, sink))
    {
        for(const auto & x: g[sink])
        {
            if(!v[x] || c[x][sink] <= 0)
            {
                continue;
            }
            t[sink] = x;
            fmin = INF;
            for(int i = sink; i != source; i = t[i])
            {
                fmin = min(fmin, c[t[i]][i]);
            }

            if(!fmin) continue;

            for(int i = sink; i != source; i = t[i])
            {
                c[t[i]][i] -= fmin;
                c[i][t[i]] += fmin;
            }
            maxflow += fmin;
        }
    }
    return maxflow;
}

int main()
{
    is >>n >> m;
    int x, y, z;
    g = vector<vector<int>>(n+1);
    for(int i = 1; i <= m; ++i)
    {
        is >> x >> y >> z;
        g[x].push_back(y);
        g[y].push_back(x);
        c[x][y] = z;

    }
    os << MaxFlow(1,n);
    is.close();
    os.close();
    return 0;
}