Cod sursa(job #352241)

Utilizator prdianaProdan Diana prdiana Data 30 septembrie 2009 21:15:44
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <stdio.h>
#include <vector>
#include <queue>
#define MAXN 1024

using namespace std;

bool viz[MAXN],ok;
int x,y,c,i,j,n,m,g[MAXN][MAXN],flow,node,f,parent[MAXN];
vector<int> e[MAXN];
queue<int> q;

inline void bfs()
{

	memset(viz,0,sizeof(viz));
	q.push(1);
	viz[1] = true;
	while (!q.empty())
	{
		f = q.front();
		for (i=0;i<e[f].size();i++)
		{
			if (!viz[e[f][i]] && g[f][e[f][i]])
			{
				q.push(e[f][i]);
				viz[e[f][i]] = true;
				parent[e[f][i]] = f;
			}
		}
		q.pop();
	}
	ok = viz[n];
}

inline void flux()
{
	int min = 0;
	for (i=0;i<e[n].size();i++)
	{
		if (g[e[n][i]][n] > 0)
		{
			min = g[e[n][i]][n];
			node = e[n][i];
			while (node != 1)
			{
				if (min>g[parent[node]][node])
				{
					min = g[parent[node]][node];
				}
				node = parent[node];
			}

			node = e[n][i];

			while (node != 1)
			{
				g[parent[node]][node] -= min;
				g[node][parent[node]] += min;
				node = parent[node];
			}

			node = e[n][i];

			g[node][n] -= min;
			g[n][node] += min;

			flow+=min;
		}
	}
}

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

	scanf("%d%d",&n,&m);

	for (i=0;i<m;i++)
	{
		scanf("%d%d%d",&x,&y,&c);
		g[x][y] += c;
		e[x].push_back(y);
		e[y].push_back(x);
	}

	bfs();

	while (ok)
	{
		flux();
		bfs();
	}

	printf("%d",flow);

	return 0;
}