Cod sursa(job #783329)

Utilizator batistaUPB-Oprea-Cosmin-Dumitru batista Data 2 septembrie 2012 16:12:38
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 1002
#define oo 0x3f3f3f3f //infinit
long cap[N][N],flux[N][N];
long t[N];
long n,m,x,y,i,c;

int bfs(int sursa,int dest)
{
	int Q[N + 1], p = 0, q = 0;
	bool use[N];
	for(int i=0;i<=N;i++)t[i]=use[i]=0;
	Q[0] = sursa;
	use[sursa] = 1;
	
	while(p<=q) 
	{
		int u=Q[p++];
	 for(int i=sursa;i<=dest;++i) // pt fiecare nod ( adiacent )
		if(!use[i]) // nu am folosit nodul
		  if(cap[u][i]-flux[u][i]>0) // mai putem pompa?
		  {
			Q[++q] = i; // inseram nodul i in coada
			t[i] = u;  
			use[i] = 1; 
		  }
	}
	return t[dest];
}

long dinic(int sursa, int dest)//calculeaza mai multe drumuri de ameliorare cu 1 singur bfs
{
	long flow=0;
	long i,min,j;
	
	while(bfs(sursa,dest)) // cat timp mai exista un drum de ameliorare
	{
	  for(j=sursa;j<dest;++j)
	   if(cap[j][dest]-flux[j][dest]>0)//ia nodurile din care se poate ajunge la destinatie
	   {
		min=oo;
			
		if(cap[j][dest]-flux[j][dest]<min) min=cap[j][dest]-flux[j][dest];
			
		for(i=j; i!=sursa; i=t[i])
			if(cap[t[i]][i]-flux[t[i]][i] < min) min=cap[t[i]][i]-flux[t[i]][i];
 //calculam minimul dintre capacitatile de pe drum
		
		if(min == oo) continue;
			
		flux[j][dest]+=min;
		flux[dest][j]-=min;
			
		for(i=j ; i!=sursa; i=t[i]) 
			flux[t[i]][i]+=min, //adaugam minimul la fluxul de pe arcele de pe drum
			flux[i][t[i]]-=min; //scadem minimul de pe arcele inverse
		
		flow+=min; // adaugam minimul la flux
	   }
	}
  return flow;	
}
int main()
{
	freopen("maxflow.in","r",stdin);freopen("maxflow.out","w",stdout);
	scanf("%d %d\n",&n,&m);
	for(i=1;i<=m;i++)
	{
		scanf("%d %d %d\n",&x,&y,&c);
		cap[x][y]=c;
	}
	printf("%d",dinic(1,n));
return 0;}