Cod sursa(job #49851)

Utilizator andrei_infoMirestean Andrei andrei_info Data 6 aprilie 2007 15:01:51
Problema Critice Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define nmax 1000
#define fin "critice.in"
#define fout "critice.out"
typedef int sir[nmax];
typedef struct edge {
                   int x,y;
                   };
int flux[nmax][nmax],c[nmax][nmax], tata[nmax],lista[nmax],list[10*nmax],n,m;
edge e[10*nmax];
sir bfs, bft;

void citire()
{
int i,x,y,z;
memset(flux,0,sizeof(flux));
memset(c,0,sizeof(c));
freopen(fin,"r",stdin);
scanf("%d %d",&n,&m);
for (i=1; i<=m;i++)
    {
    scanf("%d %d %d",&x,&y,&z);
    e[i].x=x; e[i].y=y;
    c[x][y]=z; c[y][x]=z;
    }
fclose(stdin);
}

int bf()
{
int i,j,k=1;
for (i=1; i<=n;i++) tata[i]=-1;
lista[1]=1; tata[1]=0;
for (i=1; i<=k; i++)
    for (j=1; j<=n; j++)
	if (tata[j] == -1 && flux[lista[i]][j] < c[lista[i]][j])
           {
           tata[j] = lista[i];
           lista[++k]=j;
           if (j==n) { i=k+1; break; }
           }
if (tata[n] !=-1) return 1;
else return 0;
}

int min(int x, int y)
{
if (x<y) return x; else return y;
}

void fflux()
{
int i,max=20000000;
for (i=n; i !=1 && tata[i] !=-1; i=tata[i])
    max = min(max,c[tata[i]][i]-flux[tata[i]][i]);
for (i=n; i!=1 && tata[i] != -1; i=tata[i])
    {
    flux[tata[i]][i]+=max;
    flux[i][tata[i]]-=max;
    }
}

void bff(int nod, sir &bol)
{
 int i=1,j,k=1;
 lista[1]=nod;
 bol[nod]=1;
 tata[1]=0;
 for (i=1; i<=k; i++)
    for (j=1; j<=n; j++)
	if ((!(bol[j])) && ( flux[lista[i]][j] < c[lista[i]][j]) )
	   {
	   bol[j]=1;
	   lista[++k]=j;
	   }
}

void bff2(int nod, sir &bol)
{
int i,j,k=1;
    lista[1]=nod;
    bol[nod]=1;
    tata[1]=0;
    for (i=1; i<=k; i++)
	for (j=1; j<=n; j++)
	    if (bol[j]==0 && flux[j][lista[i]] < c[j][lista[i]])
	       {
	       bol[j]=1;
	       lista[++k] = j;
	       }
}


void calc()
{
int i,k=0;
while (bf() == 1)
      fflux();
bff(1,bfs);
bff2(n,bft);
for (i=1; i<=m; i++)
    if ((bfs[e[i].x] && bft[e[i].y]) || (bfs[e[i].y] && bft[e[i].x]) )
       list[++k]=i;

freopen(fout,"w",stdout);
printf("%d\n",k);
for (i=1; i<=k; i++)
    printf("%d\n",list[i]);
fclose(stdout);
}

int main()
{
citire();
calc();
return 0;
}