Cod sursa(job #148022)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 3 martie 2008 20:31:23
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.52 kb
#include<stdio.h>
long n,m,grad[1001],x[10001],y[10001],cp[1001][1001],fl[1001][1001],
*vec[1001],h[1001],e[1001];
void citire();
void flux();
void conex1();
void conex2();
void afisare();
int main()
{
	citire();
	flux();//algoritmul cu preflux
	conex1();//noduri conectate la sursa in reteaua reziduala
	conex2();//noduri conectate la destinatie in reteaua reziduala
	afisare();
	return 0;
}
void citire()
{       long i,xx,yy,cc;
	FILE *f=fopen("critice.in","r");
	fscanf(f,"%ld%ld",&n,&m);//n=nr varfuri;m=nr muchii;
	for(i=1;i<=m;i++)
	{ fscanf(f,"%ld%ld%ld",&xx,&yy,&cc);
	  grad[xx]++;grad[yy]++;x[i]=xx;y[i]=yy;
	  cp[xx][yy]=cp[yy][xx]=cc;
	}//citire muchii si capacitati;calcul grade varfuri;
	for(i=1;i<=n;i++)
	{ vec[i]=new long [grad[i]+2];
	  vec[i][grad[i]+1]=0;
	  grad[i]=0;
	}//alocare spatiu pt lista vecini;
	for(i=1;i<=m;i++)
	{ vec[x[i]][++grad[x[i]]]=y[i];
	  vec[y[i]][++grad[y[i]]]=x[i];
	}//creare lista vecini
	fclose(f);
}
void flux()
{       long i,j,k,push,lift,hmin,f0;
	h[1]=n;
	for(i=1;i<=grad[1];i++)
	{j=vec[1][i];fl[1][j]=cp[1][j];fl[j][1]=-cp[1][j];e[j]=cp[1][j];}
	i=0;
	while(i!=n)
	{ for(i=2;i<n;i++)
	   if(e[i]>0)
	    { push=0;lift=0;hmin=2*n;
	      for(k=1;k<=grad[i];k++)
	      { j=vec[i][k];
		if(cp[i][j]>fl[i][j])
		{ lift++;
		  if(h[i]==h[j]+1)
		  { f0=(e[i]<cp[i][j]-fl[i][j])?e[i]:cp[i][j]-fl[i][j];
		    fl[i][j]+=f0;fl[j][i]=-fl[i][j];
		    e[i]-=f0;e[j]+=f0;
		    push=1;
		  }
		  else
		  if(h[j]<hmin)hmin=h[j];
		}
		if(push)break;
	      }
	     if(push)break;
	     if(lift){h[i]=hmin+1;break;}
	    }
	}
}
void conex1()
{       long i,first,last,ii,jj,nv,coada[1001];
	for(i=1;i<=n;i++)e[i]=0;e[1]=1;
	first=1;last=1;coada[1]=1;
	while(first<=last)
	{ ii=coada[first];
	  nv=grad[ii];
	  for(i=1;i<=nv;i++)
	  { jj=vec[ii][i];
	    if(e[jj])continue;
	    if(cp[ii][jj]<=fl[ii][jj])continue;
	    coada[++last]=jj;
	    e[jj]=1;
	  }
	  first++;
	}
}
void conex2()
{       long i,first,last,ii,jj,nv,coada[1001];
	e[n]=2;
	first=1;last=1;coada[1]=n;
	while(first<=last)
	{ ii=coada[first];
	  nv=grad[ii];
	  for(i=1;i<=nv;i++)
	  { jj=vec[ii][i];
	    if(e[jj])continue;
	    if(cp[jj][ii]<=fl[jj][ii])continue;
	    coada[++last]=jj;
	    e[jj]=2;
	  }
	  first++;
	}
}
void afisare()
{       long i,sol=0;
	FILE *f=fopen("critice.out","w");
	for(i=1;i<=m;i++)
	 if(e[x[i]]+e[y[i]]==3)sol++;
	fprintf(f,"%ld\n",sol);
	for(i=1;i<=m;i++)
	 if(e[x[i]]+e[y[i]]==3)
	  fprintf(f,"%ld\n",i);
	fclose(f);
}