Cod sursa(job #320300)

Utilizator blasterzMircea Dima blasterz Data 4 iunie 2009 12:08:21
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 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];

int maxc;

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;
		if(c > maxc) maxc=c;
		
	}
	
	
}

inline int bfs(int mincap)
{
	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] >= mincap)
				if(!use[*i])
					//if(cap[u][*i])
					{
						Q[++q] = *i;
						t[*i] = u;
						use[*i] = 1;
						//if( *i == n ) return 1;
					}
	}
	
	if(t[n] == 0) return 0;
	return 1;
	
}

void solve()
{
	int cnt,j,mn;
	int flow=0;
	vit i;
	for(cnt=1; cnt <= maxc; cnt<<=1);
	
	cnt=1;
//	for(; cnt; cnt>>=1)
	{
		
		while(bfs(cnt))
		{
			
			for(i = a[n].begin(); i != a[n].end(); ++i)
				if(t[*i] && cap[*i][n])
				{
					mn=oo;
					mn = cap[*i][n];
					
					for(j=*i; j != 1; j = t[j])
						mn = min(mn, cap[t[j]][j]);
			
					
					cap[*i][n] -= mn;
					cap[n][*i] += mn;
					
					for(j=*i; 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;
}