Cod sursa(job #693645)

Utilizator hiticas_abelhiticasabel hiticas_abel Data 27 februarie 2012 14:54:09
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <stdio.h>
#include <string.h>
#include <queue>

inline int min(int a,int b){return a<b?a:b;}
using namespace std;

int n, maxflow = 0, flow;
int a[1001][1001];
int t[1001];
queue<int> coada;

void read();
void solve();
void write();
int bfs();

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

int bfs()
{

	int i, nod;
	while (!coada.empty()) coada.pop();
	
	memset(t,0,sizeof(t));
	
    coada.push(1);
   t[1]=1;
    while (!coada.empty())
	{
		nod = coada.front();
		
		
		for (i = 2; i <= n; ++i)
		
			if (a[nod][i] && !t[i])
			{
				t[i] = nod;
				if (i==n) return 1;
                coada.push(i);
				
             }
             coada.pop();
		
	}
return 0;
}

void solve()
{
	int i; 

	while (bfs())
	{
		flow = 1000000;
		
	
	
		for (i = n; i!=1; i=t[i])
		{
			flow=min(flow,a[t[i]][i]);
		}
		
		for (i = n; i!=1; i = t[i])
		{
			a[t[i]][i] -= flow;
	     	a[i][t[i]] += flow;
		}
		maxflow += flow;
	}
}

void write()
{
	FILE *fout = fopen("maxflow.out", "w");
	fprintf(fout, "%d\n", maxflow);
	fclose(fout);
}

void read()
{
	int m, x, y, z;
	FILE *fin = fopen("maxflow.in", "r");
	fscanf(fin, "%d%d", &n, &m);
	for (; m; --m)
	{
		fscanf(fin, "%d%d%d", &x, &y, &z);
	 	a[x][y] = z;
	}
	fclose(fin);
}