Cod sursa(job #266913)

Utilizator Sorin_IonutBYSorynyos Sorin_Ionut Data 26 februarie 2009 12:06:27
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include<stdio.h>
#define Nm 1001
#define Mm 10001
#define Inf Nm*10000
#define min(a,b) ((a)<(b)?(a):(b))
int G[Nm][Nm],C[Nm][Nm],X[Mm],Y[Mm],D[Nm],n,m;
int F[Nm][Nm],A[Mm],Q[Nm],Pre[Nm],M[Nm],S[Nm],T[Nm];

void read()
{
    int i,c;

    freopen("critice.in","r",stdin);
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++)
    {
	scanf("%d%d%d",X+i,Y+i,&c);
	G[X[i]][D[X[i]]++]=Y[i];
	G[Y[i]][D[Y[i]]++]=X[i];
	C[X[i]][Y[i]]=C[Y[i]][X[i]]=c;
    }
}

int BFS_s()
{
    int l,r,x,y,i;

    Q[l=r=0]=1;
    Pre[1]=-1;
    M[1]=Inf;
    for(i=2;i<=n;i++)
	Pre[i]=0;

    while(l<=r)
    {
	x=Q[l++];
	for(i=0;i<D[x];i++)
	{
	    y=G[x][i];
	    if(!Pre[y] && F[x][y]<C[x][y])
	    {
		Pre[y]=x;
		M[y]=min(M[x],C[x][y]-F[x][y]);
		Q[++r]=y;
	    }
	}
   }

    return Pre[n]!=0;
}

void BFS_t()
{
    int l,r,x,y,i;

    Q[l=r=0]=n;
    T[n]=1;

    while(l<=r)
    {
	x=Q[l++];
	for(i=0;i<D[x];i++)
	{
	    y=G[x][i];
	    if(!T[y] && F[y][x]<C[y][x])
	    {
		T[y]=1;
		Q[++r]=y;
	    }
	}
    }
}

void solve()
{
    int i;

    while(BFS_s())
    {
	i=n;
	while(i>1)
	{
	    F[Pre[i]][i]+=M[n];
	    F[i][Pre[i]]-=M[n];
	    i=Pre[i];
	}
    }

    for(i=1;i<=n;i++)
	if(Pre[i])
	    S[i]=1;

    BFS_t();

    A[0]=0;
    for(i=1;i<=m;i++)
	if(S[X[i]] && T[Y[i]] || S[Y[i]] && T[X[i]])
	    A[++A[0]]=i;
}

void write()
{
    int i;

    freopen("critice.out","w",stdout);
    printf("%d\n",A[0]);
    for(i=1;i<=A[0];i++)
	printf("%d\n",A[i]);
}

int main()
{
    read();
    solve();
    write();
    return 0;
}