Cod sursa(job #190060)

Utilizator crusRus Cristian crus Data 19 mai 2008 20:36:43
Problema Critice Scor 20
Compilator c Status done
Runda Arhiva de probleme Marime 2.18 kb
#include <stdio.h>
#include <string.h>
#define input "critice.in"
#define output "critice.out"
#define nmax 1001
#define mmax 10001
#define maxim 30000
int niv,n,m,i,v[nmax][nmax],c[nmax][nmax],f[nmax][nmax],nv[nmax],fol[nmax],t[nmax],d[nmax];
int v1[nmax],v2[nmax],xx[mmax],yy[mmax];
void add(int x,int y,int z)
{
 nv[x]++; nv[y]++;
 v[x][nv[x]]=y;
 v[y][nv[y]]=x;
 c[x][y]=c[y][x]=z;
}
int abs(int x)
{
 if (x>0) return x;
 return -x;
}
void read()
{
 int i,x,y,c;
 freopen(input,"r",stdin);
 scanf("%d %d",&n,&m);
 for (i=1;i<=m;i++)
     {
      scanf("%d %d %d",&x,&y,&c);
      add(x,y,c);
      xx[i]=x;
      yy[i]=y;
     }
}
int min(int a,int b)
{
 if (a<b) return a;
 return b;
}
int max(int a,int b)
{
 if (a>b) return a;
 return b;
}
int bfs()
{
 int i,cap=1,coada=1,nod;
 d[1]=1;
 t[1]=0;
 for (i=1;i<=n;i++) fol[i]=0; fol[1]=1;
 while (cap<=coada)
       {
	nod=d[cap];
	for (i=1;i<=nv[nod];i++)
	    if (fol[v[nod][i]]==0 && c[nod][v[nod][i]]-f[nod][v[nod][i]]>0)
	       {
		coada++;
		d[coada]=v[nod][i];
		fol[v[nod][i]]=1;
		t[v[nod][i]]=nod;
	       }
	cap++;
       }
 return fol[n];
}
void solve()
{
 int flux;
 while (bfs())
       {
	flux=maxim;
	for (i=n;i-1;i=t[i]) flux=min(flux,c[t[i]][i]-f[t[i]][i]);
	for (i=n;i-1;i=t[i])
	    {
	     f[t[i]][i]+=flux;
	     f[i][t[i]]-=flux;
	    }
       }
}
void bf(int n,int d[])
{
 int i,cap=1,coada=1,nod;
 d[1]=n;
 for (i=1;i<=n;i++) fol[i]=0; fol[n]=1;
 while (cap<=coada)
       {
	nod=d[cap];
	for (i=1;i<=nv[nod];i++)
	    if (fol[v[nod][i]]==0 && c[nod][v[nod][i]]-abs(f[nod][v[nod][i]])>0)
	       {
		coada++;
		d[coada]=v[nod][i];
		fol[v[nod][i]]=1;
	       }
	cap++;
       }
 for (i=1;i<=n;i++) d[i]=fol[i];
}
void write()
{
 int x,y,i,nr=0;
 freopen(output,"w",stdout);
 bf(1,v1);
 bf(n,v2);
 for (i=1;i<=m;i++)
     {
      x=xx[i]; y=yy[i];
      if ((v1[x]^v2[x]) && (v1[y]^v2[y]) && (v2[x]^v2[y])) nr++;
     }
 printf("%d\n",nr);
 for (i=1;i<=m;i++)
     {
      x=xx[i]; y=yy[i];
      if ((v1[x]^v2[x]) && (v1[y]^v2[y]) && (v2[x]^v2[y])) printf("%d\n",i);
     }
}
int main()
{
 read();
 solve();
 write();
 return 0;
}