Cod sursa(job #613493)

Utilizator balakraz94abcd efgh balakraz94 Data 27 septembrie 2011 22:54:27
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.06 kb
#include<cstdio>
#include<vector>
#include<bitset>
#include<queue>
#define infile "maxflow.in"
#define outfile "maxflow.out"
#define n_max 1005
#define pb push_back
#define INF 1<<30
#define FOR(g, it) \
	for(vector<int> :: iterator it = g.begin(); it!=g.end(); ++it)
using namespace std;

vector < int > v[n_max];//graful

int c[n_max][n_max], f[n_max][n_max]; // capacitatea si fluxul

int t[n_max];//t[i]  = tatal lui i in parcurgerea bfs

bitset <n_max> uz; //uz[i]=1 daca i a fost folosit in bfs

int flux;//fluxul maxim total

int n;


void citeste()
{
	freopen(infile,"r",stdin);
	
	int m, x, y, cost;
	
	scanf("%d %d",&n, &m);
	
	while(m--)
	{
		scanf("%d %d %d",&x,&y,&cost);
		
		v[x].pb(y);
		v[y].pb(x);
		c[x][y] = cost;
	}
	
	fclose(stdin);
}




int bfs()
{
	queue < int > q;
	
	uz.reset();
	
	q.push(1);//adaug in coada primul nod
	uz.set(1);;//il marchez ca utilizat
	
	int nod;
	vector < int > ::iterator it;
	
	while(!q.empty())//am noduri in coada
	{
		nod = q.front();//elementul curent
		
		q.pop();//scot elementul din coada
		
		if(nod==n)
			continue;
		
		FOR(v[nod],it)
		    if(c[nod][*it] != f[nod][*it] && !uz[*it])//daca exista cost (exista arc) si nu am folosit acest nod pana acum
			{
				uz.set(*it);//il marchez ca utilizat
				q.push(*it);//il adaug in coada
				t[*it] = nod; //ii salvez tatal din bfs
			}
	}
	
	return uz[n];
}




void rezolva()
{
	
	int fmin = INF;
	
	while(bfs())
		FOR(v[n], it)
		{
			int nod = *it;
			
			if(f[nod][n] == c[nod][n] || !uz[nod])
				continue;
		
        t[n] = nod;
		
		fmin = INF;
		for(nod = n; nod != 1; nod = t[nod])
			fmin = min(fmin, c[t[nod]][nod] - f[t[nod]][nod]);
        
		if(!fmin)
			continue;
		
		for(nod = n; nod!=1; nod = t[nod])
		{
			f[t[nod]][nod] +=fmin;
			f[nod][t[nod]] -=fmin;
		}
		
		flux +=fmin;
		}
}




void afiseaza()
{
	freopen(outfile,"w",stdout);
	
	printf("%d\n",flux);
	
	fclose(stdout);
}


int main()
{
	citeste();
	rezolva();
	afiseaza();
	
	return 0;
}