Cod sursa(job #303571)

Utilizator snaked31Stanica Andrei snaked31 Data 9 aprilie 2009 23:45:28
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <deque>

#define nm 1010
#define INF 0x3f3f3f3f

using namespace std;


deque <int> q;
vector <int> v[nm];

int i, n, m, x, y, c;
int R[nm][nm];
int viz[nm];
int from[nm];

inline int mn (int a, int b) { return ( a < b ? a : b); }


int bfs()

{

	q.clear();
    q.push_back(1);
    viz[1] = 1;
    for (int i=2; i<=n; ++i)
	{
    	viz[i] = 0;
		from[i] = -1;
	}
    from[1] = -1;

    int p, p_c, prev, done = 0;;

    while (q.size() > 0 && !done)
    {
    	p = q.front();


        for (vector <int>::iterator it = v[p].begin(); it != v[p].end() && !done; ++it)
        {
        	if (viz[*it] == 0 && R[p][*it] > 0)
            {
            	q.push_back(*it);
                viz[*it] = 1;
                from[*it] = p;
                if (*it == n)
                {
//                	it = v[p].end();
					done = 1;
  //                  q.clear();
                }
            }
        }
        q.pop_front();
    }

    p = n;
    p_c = INF;
    while (from[p] > -1)
    {
    	prev = from[p];
        p_c = mn(p_c, R[prev][p]);
        p = prev;
    }

    p = n;

    while (from[p] > -1)
    {
    	prev = from[p];
        R[prev][p] -= p_c;
        R[p][prev] += p_c;
        p = prev;
    }
    
    if (p_c < INF)
    	return p_c;
    return 0;

}


int max_flow()

{
	int sol = 0, pc;

    while (true)
    {
		pc = bfs();
        if (pc != 0)
        	sol += pc;
        else
        	return sol;
    }
    return sol;


}


int main()

{
	freopen("maxflow.in", "r", stdin);
    freopen("maxflow.out","w",stdout);

    scanf("%d %d ", &n, &m);
    for (i=1; i<=m; ++i)
    {
    	scanf("%d %d %d ", &x, &y, &c);
        v[x].push_back(y);
		v[y].push_back(x);
        //F[x][y] = c;
        R[x][y] += c;
        //R[y][x] = 0;
    }

    printf("%d\n", max_flow());

	return 0;
}