Cod sursa(job #513470)

Utilizator gabipurcaruGabi Purcaru gabipurcaru Data 15 decembrie 2010 22:13:28
Problema Flux maxim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
// infoarena: problema/maxflow //
#include <fstream>
#include <queue>
#include <cstring>
#include <iostream>
using namespace std;

const int MAXN = 1010;

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

int f[MAXN][MAXN],c[MAXN][MAXN],i,j,n,m,a,b,s,d,t[MAXN],r,flux,e,vn[MAXN];
vector<int> g[MAXN];
deque<int> q;
vector<int>::iterator it, fin;

inline int bf()
{
    memset(t, 0, sizeof(t[0]) * (n+1));
    q.resize(0);
	q.push_back(s);
	int nod,v,ok=0;
	while(!q.empty())
	{
		nod = q.front(); q.pop_front();
        fin = g[nod].end();
        for(it = g[nod].begin(); it!=fin; ++it)
        {
            v = *it;
			if(!t[v] && c[nod][v] > f[nod][v])
			{
				t[v] = nod, q.push_back(v);
				if(v == d)
					ok = 1;
			}
        }
	}
	return ok;
}

int main()
{
	in>>n>>m;
	for(i=1; i<=m; i++)
    {
		in>>a>>b;
        in>>c[a][b];
        g[a].push_back(b);
        g[b].push_back(a);
        if(b == n)
            vn[++vn[0]] = a;
    }
	
	s=1, d=n;
	
    while(bf())
        for(j=1; j<=vn[0]; j++)
        {
            e = vn[j];
            r = c[e][n] - f[e][n];
            for(i=e; i!=s && i; i=t[i])
                r = min(r, c[t[i]][i] - f[t[i]][i]);
            for(i=e; i!=s && i; i=t[i])
            {
                f[t[i]][i] += r;
                f[i][t[i]] -= r;
            }
            flux += r;
        }
	
	out<<flux;
	
	return 0;
}