Cod sursa(job #42764)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 29 martie 2007 15:09:05
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.6 kb
# include <stdio.h>
# include <stdlib.h>

const long int MAXN=1000;
const long int MAXM=10000;

typedef struct MUCHIE {long int a,b,cost;};
MUCHIE muc[MAXM+1];
long int ladiac[MAXN+1][MAXN+1];
long int a[MAXN+1][MAXN+1],m,n;
typedef struct NODC {long int nod,tata;};
int sel_mark[MAXN+1];

void add(long int loc, long int nod) {ladiac[loc][++ladiac[loc][0]]=nod;}


void citire()
{
FILE *f=fopen("critice.in","r");
fscanf(f,"%ld%ld",&n,&m);
long int i,aa,bb,cc;
for (i=1;i<=m;i++)
	{
	fscanf(f,"%ld%ld%ld",&aa,&bb,&cc);
	muc[i].a=aa;muc[i].b=bb;muc[i].cost=cc;
	add(aa,bb);
	add(bb,aa);
	a[aa][bb]=a[bb][aa]=cc;
	}
fclose(f);
}

long int bfs(NODC c[], long int &ultim)
{
long int prim=1;
c[++ultim].nod=1;
c[ultim].tata=0;
int sel[MAXN+1]={0};
long int p;
sel[1]=1;
while (prim<=ultim&&!sel[n])
	{
	p=1;
	while (p<=ladiac[c[prim].nod][0])
		{
		if (a[c[prim].nod][ladiac[c[prim].nod][p]]&&!sel[ladiac[c[prim].nod][p]])
			{
			c[++ultim].nod=ladiac[c[prim].nod][p];
			c[ultim].tata=prim;
			sel[c[ultim].nod]=1;
			if (sel[n]) break;
			}
		p++;
		}
	if (sel[n]) break;
	prim++;
	}
if (!sel[n]) return 0;
return 1;
}

long int find_min(NODC c[], long int ultim)
{
long int tat=c[ultim].tata,min=100000;
while (tat)
	{
	if (min>a[c[tat].nod][c[ultim].nod]) min=a[c[tat].nod][c[ultim].nod];
	ultim=tat;
	tat=c[ultim].tata;
	}
return min;
}

void saturate(long int min, NODC c[], long int ultim)
{
long int tat=c[ultim].tata;
while (tat)
	{
	a[c[tat].nod][c[ultim].nod]-=min;
	a[c[ultim].nod][c[tat].nod]+=min;
	ultim=tat;
	tat=c[ultim].tata;
	}
}

void det_max_flow()
{
long int ultim,ok,min;
NODC coada[MAXN+1];
do
	{
	ultim=0;
	ok=bfs(coada,ultim);
	if (!ok) break;
	min=find_min(coada,ultim);
	saturate(min,coada,ultim);
	}
while(ok);
}

void bfs2(long int sursa, int mark)
{
long int prim=1,ultim=1;
NODC c[MAXN+1];
c[1].nod=sursa;
c[1].tata=0;
long int p;
sel_mark[sursa]=mark;
while (prim<=ultim)
	{
	p=1;
	while (p<=ladiac[c[prim].nod][0])
		{
		if (a[c[prim].nod][ladiac[c[prim].nod][p]]&&!sel_mark[ladiac[c[prim].nod][p]])
			{
			c[++ultim].nod=ladiac[c[prim].nod][p];
			c[ultim].tata=prim;
			sel_mark[c[ultim].nod]=mark;
			}
		p++;
		}
	prim++;
	}
}

void scrie()
{
FILE *g=fopen("critice.out","w");
long int nr=0,i;
for (i=1;i<=m;i++)
	if (sel_mark[muc[i].a]*sel_mark[muc[i].b]==2) nr++;
fprintf(g,"%ld\n",nr);
for (i=1;i<=m;i++)
	if (sel_mark[muc[i].a]*sel_mark[muc[i].b]==2)
		fprintf(g,"%ld\n",i);
fcloseall();
}


int main()
{
citire();
det_max_flow();
bfs2(1,1);
bfs2(n,2);
scrie();
return 0;
}