Cod sursa(job #282518)

Utilizator ScrazyRobert Szasz Scrazy Data 17 martie 2009 20:13:10
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <cstdio>
#include <vector>
#include <queue>

using namespace std;
const int maxn = 1001;

#define inf 0x3f3f3f3f

vector<int> g[maxn];
int cap[maxn][maxn], flux[maxn][maxn];

int t[maxn];

int n;

int S, D;

void read()
{ 
    int m;
    scanf("%d%d", &n, &m);
    for(; m; --m)
    {
	int x, y, z; scanf("%d%d%d", &x, &y, &z); 
	cap[x][y] += z;
	g[x].push_back(y);
	g[y].push_back(x);
    }
    S = 1; D = n;
}

int bfs()
{ 
    int viz[maxn];

    for (int i = 0; i <= D; ++i) viz[i] = 0;
    queue<int> Q;
    Q.push(S); viz[S] = 1;

    while (!Q.empty())
    {
	int now = Q.front();
	Q.pop();

	for (int i = 0; i < g[now].size(); ++i)
	{
	    int next = g[now][i];
	    if (viz[next]) continue;
	    if (cap[now][next] == flux[now][next]) continue;

	    t[next] = now;
	    Q.push(next); viz[next] = 1;
	    if (next == D) return 1;
	}
    }

    return 0;

}

int f()
{
    int flow = 0;


    while (bfs())
    { 
	int minn = inf;
	for (int i = D; i != S; i = t[i])
	    if (minn > cap[t[i]][i] - flux[t[i]][i]) minn = cap[t[i]][i] - flux[t[i]][i];

	for (int i = D; i != S; i = t[i])
	{ 
	    flux[t[i]][i] += minn;
	    flux[i][t[i]] -= minn;
	}

	flow += minn;
    }

    return flow;
}

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

    read();
    printf("%d\n", f());

    return 0;
}