Cod sursa(job #238862)

Utilizator blasterzMircea Dima blasterz Data 3 ianuarie 2009 14:58:48
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
using namespace std;
#include <algorithm>
#include <cstdio>
#include <string>
#define N 1001

int cap[N][N];

struct nod { int x; nod *n;};

nod *a[N];
int n, m;
int t[N];

inline int bfs()
{
	int Q[N], p=0, q=0;
	bool use[N];
	int d[N];
	memset(use, 0, sizeof(use));
	memset(t, 0, sizeof(t));
	memset(d, 0, sizeof(d));
	use[1]=1;
	Q[0]=1;
	
	while(p<=q)
	{
		int u=Q[p++];
		
		for(nod *i=a[u]; i; i=i->n)
			if(!use[i->x])
				if(cap[u][i->x] > 0)
				{
					Q[++q]=i->x;
					use[i->x]=1;
					t[i->x]=u;
					d[i->x]=d[u] + 1;
				}
	}
	
	if(t[n] == 0) return 0;
	return 1;
}

void solve()
{
	int flow=0;
	
	while(bfs())
	{
		for(nod *i=a[n]; i; i=i->n)
			if(t[i->x])
			{
				int mn=0x3f3f3f3f;
				for(int j=i->x; t[j]; j=t[j])
					mn=min(mn, cap[t[j]][j]);
				mn=min(mn, cap[i->x][n]);
				if(mn <= 0) continue;
				
				cap[i->x][n]-=mn;
				cap[n][i->x]+=mn;
				
				for(int j=i->x; t[j]; j=t[j])
					cap[t[j]][j]-=mn,
					cap[j][t[j]]+=mn;
				flow+=mn;
			}
		
	}
	
	printf("%d\n", flow);
	
}

int main()
{
	freopen("maxflow.in","r",stdin);
	freopen("maxflow.out","w",stdout);
	scanf("%d %d\n", &n, &m);
	while(m--)
	{
		int p,q,c;
		scanf("%d %d %d\n", &p, &q,&c);
		nod *t=new nod;
		t->x=q;
		t->n=a[p];
		a[p]=t;
		t=new nod;
		t->x=p;
		t->n=a[q];
		a[q]=t;
		cap[p][q]=c;
	}
	
	solve();
	
	return 0;
}