Cod sursa(job #1201696)

Utilizator heracleRadu Muntean heracle Data 25 iunie 2014 20:26:20
Problema Critice Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include<cstdio>
#include<queue>
#include<cstring>
FILE* in=fopen("critice.in","r");
FILE* out=fopen("critice.out","w");

int nrnod,nrmuc;

const int Q=1001,INF=2000000000;

int mat[Q][Q],flux[Q][Q];

std::queue<int> q;

bool viz[Q];

int pred[Q],nr;

bool bfs()
{
	while(!q.empty() )
		q.pop();
	memset(viz,0,sizeof viz);

	q.push(1);
	viz[1]=1;
	int act;
	nr=0;
	while(!q.empty() )
	{
		act=q.front();
		q.pop();

		for(int i=1; i<nrnod; i++)
		{
			if(viz[i]==0 && mat[act][i]-flux[act][i]>0)
			{
				pred[i]=act;
				viz[i]=1;
				q.push(i);
			}
		}
		if(mat[act][nrnod]-flux[act][nrnod]>0)
		{
			pred[nrnod]=act;
			return 1;
		}
	}
	return 0;
}

int parcurgere()
{
	int act=nrnod;
	int rez=INF;
	while(pred[act]!=0)
	{
		if(mat[pred[act]][act]-flux[pred[act]][act]<rez)
			rez=mat[pred[act]][act]-flux[pred[act]][act];
		act=pred[act];
	}
	return rez;
}

void fluxare(int x)
{
	int act=nrnod;
	while(pred[act]!=0)
	{
		flux[pred[act]][act]+=x;
		flux[act][pred[act]]-=x;
		act=pred[act];
	}
}

struct muchie{
	int a,b;
	bool bun;
}muc[10*Q];

int rez[10*Q];

int main()
{
	fscanf(in,"%d%d",&nrnod,&nrmuc);

	int a,b,c;

	for(int i=1; i<=nrmuc; i++)
	{
		fscanf(in,"%d%d%d",&a,&b,&c);
		mat[a][b]=c;
		mat[b][a]=c;
		muc[i].a=a;
		muc[i].b=b;
	}
	int min;
	while(bfs() )
	{
		min=parcurgere();
		fluxare(min);
	}
	/*
	for(int i=1; i<=nrmuc; i++)
	{
		mat[muc[i].a][muc[i].b]++;
		mat[muc[i].b][muc[i].a]++;

		if(bfs())
		{
			rez[++rez[0]]=i;
		}
			
		mat[muc[i].a][muc[i].b]--;
		mat[muc[i].b][muc[i].a]--;
	}*/

	for(int i=0; i<=rez[0]; i++)
		fprintf(out,"%d\n",rez[i]);
}