Cod sursa(job #1402368)

Utilizator misinoonisim necula misino Data 26 martie 2015 15:31:20
Problema Flux maxim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include<fstream>
#include<cstring>
#include<vector>
#include<queue>

#define INF 0x3f3f3f3f
#define N 1010

using namespace std;

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

int n,m,i,x,mini,y,viz[N],t[N],cap[N][N],fl[N][N];

queue<int>q;

vector<int>v[N];

inline bool bfs(){
    memset(viz, 0, sizeof(viz));

    q.push(1);
    viz[1] = 1;

    while(!q.empty())
    {
        x = q.front();
        q.pop();

        if(x == n)
            continue;

        for(vector<int>::iterator it = v[x].begin(); it != v[x].end(); ++it)
            if(cap[x][*it] > fl[x][*it] && !viz[*it])
            {
                t[*it] = x;

                viz[*it] = 1;
                q.push(*it);
            }
    }

    return viz[n];
}

inline int Max_Flow(){
    int Flux = 0;

    while(bfs())
    {
        for(i = 1; i < n; ++i)
            if(cap[i][n] > fl[i][n] && viz[i])
            {
                t[n] = i;
                x = n;
                mini = INF;

                while(x != 1)
                {
                    mini = min(mini, cap[t[x]][x] - fl[t[x]][x]);
                    x = t[x];
                }

                if(!mini)
                    continue;

                Flux += mini;
                x = n;

                while(x != 1)
                {
                    fl[t[x]][x] += mini;
                    fl[x][t[x]] -= mini;

                    x = t[x];
                }
            }
    }

    return Flux;
}

int main()
{
    f >> n >> m;

    for(i = 1; i <= m; ++i)
    {
        f >> x >> y;
        f >> cap[x][y];

        v[x].push_back(y);
    }

    g << Max_Flow() << '\n';

    return 0;
}