Cod sursa(job #641052)

Utilizator batistaUPB-Oprea-Cosmin-Dumitru batista Data 27 noiembrie 2011 01:05:19
Problema Flux maxim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include<fstream>
#include<cstdio>
using namespace std;
int cap[1001][1001],flux[1001][1001],l[1001];//l=land de la destinatie la sursa
int n,m,x,y,c,i;
short viz[1002];
ofstream g("maxflow.out");
int abs(int nr)
{
	if(nr>-1)return nr;
	return -nr;
}
int minim(int a,int b)
{
	if(a<b)return a;
	return b;
}
int bfs(int s,int d)
{int u=1,p=1,nd=s,i,c[1001];//nodul sursa = 1
  c[1]=s; viz[s]=1;
	while(p<=u && !viz[d])
	{
		for(i=1;i<=n;i++)
		  if(!viz[i])//daca am muchie de la nd la i
			if(cap[nd][i]>flux[nd][i])
			{ 
				c[++u]=i; viz[i]=nd;
			}
			else
			if(flux[i][nd]>0)
			{
				c[++u]=i; viz[i]=-nd;//avem arc saturat
			}
	  nd=c[++p];
	}
   return viz[d];//daca nu e vizitat fluxul este maxim
}

void ek(int s,int d)
{int a=110001,b=110001,minn,k,fluxmax=0;//maresc fluxul cu minimul lui a
	while(bfs(s,d))
	{
		k=0; l[k]=d;
		while(l[k]!=s)
		{
			k++;
			l[k]=abs(viz[l[k-1]]);//introdul in land nodul care intra in nodul curent
			if(viz[l[k-1]]>0)
			  if(cap[l[k]][l[k-1]]>flux[l[k]][l[k-1]]) 
				a=minim(a,cap[l[k]][l[k-1]]-flux[l[k]][l[k-1]]);//minimul de marire de flux
			 else
		    if(viz[l[k-1]]<0)b=min(b,flux[l[k-1]][l[k]]);
		}
		minn=minim(a,b);
		for(k;k>0;k--)
			if(viz[l[k-1]]>0)
			  flux[l[k]][l[k-1]]+=minn;
			else
			  flux[l[k-1]][l[k]]-=minn;
		for(i=1;i<=n;i++)viz[i]=0;
	}
	for(i=1;i<=n;i++) fluxmax+=flux[i][n];
	g<<fluxmax;
}

int main()
{
	freopen("maxflow.in","r",stdin);
	scanf("%d %d",&n,&m);
	for(i=1;i<=m;i++)
	{
		scanf("%d %d %d",&x,&y,&c);
		cap[x][y]=c;
	}
	ek(1,n);//edmonds-karp
	g.close();
return 0;}