Cod sursa(job #560252)

Utilizator selea_teodoraSelea Teodora selea_teodora Data 18 martie 2011 13:26:14
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include<fstream>
using namespace std;
int n,m,c[1005][1005],valflux,minim,d[1005],i,k,viz[1005],prim,ultim,coa[1005],tata[1005],j;
const int inf=1<<30;
typedef
struct nod
{
	int nr;
	nod *urm;
}*Pnod;
Pnod l[1005];
ofstream fout("maxflow.out");
void gaseste_dum()
{
	for(i=1;i<=n;i++)
		viz[i]=0;
	prim=1;
	ultim=1;
	coa[1]=1;
	viz[1]=1;
	tata[1]=0;
	k=0;
//	Pnod p;
	int x,aux;
	while(prim<=ultim)
	{
		for(i=1;i<=n;i++)
			if(viz[i]==0&&c[coa[prim]][i]>0)
			{
				coa[++ultim]=i;
				viz[i]=1;
				tata[i]=coa[prim];
				if(i==n)
				{
					k=1;
					d[1]=n;
					x=n;
					while(tata[x]!=0)
					{
						k++;
						d[k]=tata[x];
						x=tata[x];
					}
					for(j=1;j<=k/2;j++)
					{
						aux=d[j];
						d[j]=d[k-j+1];
						d[k-j+1]=aux;
					}
				return;
				}
			}
	     prim++;
	}
}

		
void ford_fulk()
{
	do
	{
		gaseste_dum();
		if(k>0)
		{
			minim=c[d[1]][d[2]];
			for(i=2;i<=k-1;i++)
				if(c[d[i]][d[i+1]]<minim)
					minim=c[d[i]][d[i+1]];
			valflux=valflux+minim;
			for(i=1;i<=k-1;i++)
			{
				c[d[i]][d[i+1]]=c[d[i]][d[i+1]]-minim;
				c[d[i+1]][d[i]]=c[d[i+1]][d[i]]+minim;
			}
		}
	}while(k!=0);
	fout<<valflux;
}

int main()
{
	ifstream fin("maxflow.in");
	fin>>n>>m;
	Pnod p;
	int i,j,cost;
	//s=1;
	//d=n;
	ofstream fout("maxflow.out");
	while(fin>>i>>j>>cost)
	{
		p=new(nod);
		p->nr=j;
		p->urm=l[i];
		l[i]=p;
		c[i][j]=cost;
		p=new(nod);
		p->nr=i;
		p->urm=l[j];
		l[j]=p;
	}
	fin.close();
	ford_fulk();
	return 0;
}