Cod sursa(job #320280)

Utilizator blasterzMircea Dima blasterz Data 4 iunie 2009 11:39:24
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
//scaling max flow
#include <cstdio>
#include <cstdlib>
#include <string>
#include <vector>
#define N 1001
using namespace std;

int cap[N][N];

typedef vector<int> vi;
typedef vector<int>::iterator vit;
#define pb push_back
#define oo 0x3f3f3f3f

vector<int> a[N];
int n, m;
int t[N];

void read()
{
	freopen("maxflow.in","r",stdin);
	scanf("%d %d\n", &n, &m);
	int p, q, c;
	
	while(m--)
	{
		scanf("%d %d %d\n", &p, &q, &c);
		
		a[p].pb(q);
		a[q].pb(p);
		cap[p][q]=c;
		
	}
	
	
}

inline int bfs(int maxcap)
{
	int Q[N], p=0,q=0,u;
	bool use[N];
	vit i;
	memset(use, 0, sizeof(use));
	memset(t, 0, sizeof(t));
	
	use[1] = 1;
 	Q[0] = 1;
	
	while(p <= q)
	{
		u = Q[p++];
		
		for(i = a[u].begin(); i != a[u].end(); ++i)
			if(cap[u][*i] <= maxcap)
				if(!use[*i])
					if(cap[u][*i])
					{
						Q[++q] = *i;
						t[*i] = u;
						if( *i == n ) return 1;
					}
	}
	
	if(t[n] == 0) return 0;
	return 1;
	
}

void solve()
{
	int i, cnt,j,mn;
	int flow=0;
	
	for(cnt=(1<<17); cnt; cnt>>=1)
	{
		while(bfs(cnt))
		{
			mn=oo;
			for(j=n; j != 1; j = t[j])
				mn = min(mn, cap[t[j]][j]);
			
			for(j=n; j != 1; j = t[j])
				cap[t[j]][j] -= mn,
				cap[j][t[j]] += mn;
			
			flow += mn;
		}
		
	}
	
	freopen("maxflow.out","w",stdout);
	printf("%d\n", flow);
	
}



int main()
{
	read();
	solve();
	
	return 0;
}