Cod sursa(job #7748)

Utilizator rusRus Sergiu rus Data 22 ianuarie 2007 11:47:45
Problema Critice Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.74 kb
#include<stdio.h>
#include<iomanip.h>
#include<math.h>
#define dim 1001
#define dim1 10001

typedef struct nod{
        int info;
        nod*urm;
        }*PNOD,NOD;
PNOD l[dim1];
int cr[dim],a[dim],b[dim];
int s[dim],t[dim],q[dim];
int c[dim][dim],f[dim][dim],costul[dim][dim],d[dim];
int q1[dim],x[dim],y[dim];

int n,m;
void citire();
void add(int ,int );
void edmondskarp();
int flux();
int min(int ,int );
int flow=0;

void drum();
void afisare();

int main()
{
    freopen("critice.in","r",stdin);
    freopen("critice.out","w",stdout);
    
    citire();
    edmondskarp();
    afisare();        
    return 0;
}
void citire()
{
     int i,cost;
     scanf("%d %d",&n,&m);
     //printf("%d %d",n,m);
     
     for(i=1;i<=m;i++)
     {
                      scanf("%d %d %d",&x[i],&y[i],&cost);
                      //add(x,y);
                                        
                      c[x[i]][y[i]]=cost;
                     
     }
     //for(PNOD p=l[1];p;p=p->urm)
     //printf("%d ",p->info);
}
void add(int i,int j)
{
     PNOD p=new NOD;
     p->info=j;
     p->urm=l[i];
     l[i]=p;
}
void edmondskarp()
{
     while(flux())
     drum();
}
int min(int a,int b)
{
    if(a<=b) return a;
    else
             return b;
}
int flux()
{
    memset(s,0,sizeof(s));
    memset(cr,0,sizeof(cr));
    memset(t,0,sizeof(t));
    memset(q,0,sizeof(q));
    int p,u,i,j;
    p=u=0;
    q[p]=q[u]=1;
    t[1]=0;
    q[1]=1;
    s[1]=0;
    cr[1]=32000;
    while(p<=u)
    {
               i=q[p];
               for(j=1;j<=n;j++)
               if(!s[j])
               {
                        if(c[i][j]>f[i][j])
                        {
                                           cr[j]=min(f[i][j]-c[i][j],cr[i]);
                                           //printf("%d ",cr[j]);
                                           q[++u]=j;
                                           t[j]=i;
                                           s[j]=1;
                                           if(j==n) return 1;
                        }
                        if(f[j][i])
                        {
                                   cr[j]=min(f[j][i],cr[i]);
                                   //printf("%d ",cr[j]);
                                   q[++u]=j;
                                   s[j]=1;
                                   t[j]=-i;
                                   if(j==n) return 1;
                        
                        }
               }
    p++;
    }
    
    return 0;
}
void drum()
{
     int i,j;
     j=n;
     while(j!=1)
     {
             i=abs(t[j]);
             if(t[j]>=0) f[i][j]++;
             else
                        f[j][i]--;
             j=i;
     }
     flow++;
}
void afisare()
{
     //printf("%d\n",flow);
     int i,j,nr=0,nr1=0,nrsol=0;
     for(i=1;i<=n;i++)
     {
                      for(j=1;j<=n;j++)
                      if(f[i][j]!=0 && f[i][j]==c[i][j])
                      {
                      //a[++nr]=i;
                      //b[++nr1]=j;
                                   nrsol++;
                                   a[++nr]=i;
                                   b[++nr1]=j;
                                   //printf("%d %d\n",i,j);
                      }
                      //printf("%d ",f[i][j]);
                      
                      //printf("\n");
     }
     
     printf("%d\n",nrsol);
     //printf("%d",b[1]);

     //for(i=1;i<=nr;i++)
     //printf("%d %d\n",a[i],b[i]);

     //for(i=1;i<=m;i++)
     //printf("%d %d\n",x[i],y[i]);

     for(i=1;i<=m;i++)
     {
	 for(j=1;j<=nr;j++)
	if(x[i]==a[j] && y[i]==b[j])
	printf("%d\n",i);
     }


}