Cod sursa(job #594867)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 10 iunie 2011 09:36:01
Problema Cuplaj maxim de cost minim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include<stdio.h>
#define INF 1000000
#define N 50001
#define M 605
int n,m,j,k,d,v[M][M],c[M][M],a[N],b[N],h,f[M][M],nr=0;
long i,e,y[N],t;

long ek(long y[N],int c[M][M],int f[M][M],int s,int d,int n,int m,long e,int v[M][M],int *nr)
{int i,lg,l[M],u,x,q[M],p,viz[M],o[M],col[M],ok;
long t=0;
do
      {for(i=1;i<=n;i++)
             {c[s][i]=1;
             v[s][i]=0;}
      for(i=n+1;i<=n+m;i++)
             {c[i][d]=1;
             v[i][d]=0;}
      for(i=s;i<=d;i++)
             {viz[i]=0;
             o[i]=INF;
             col[i]=0;}
      o[s]=p=u=ok=0;
      q[0]=s;
      while(p<=u)
             {x=q[p++];
             for(i=1;i<=n+m+1;i++)
             if(!col[i]&&f[x][i]<c[x][i]&&o[i]>o[x]+v[x][i])
                     {viz[i]=x;
                     col[i]=1;
                     q[++u]=i;
                     o[i]=o[x]+v[x][i];}
             if(col[d])
                     col[d]=0;}
      if(!viz[d])
             return t;
      t+=o[d];
      l[0]=d;
      lg=0;
      while(l[lg]!=s)
             {lg++;
             l[lg]=viz[l[lg-1]];}
      for(i=lg;i>0;i--)
             {f[l[i]][l[i-1]]=1;
             if(l[i]!=s&&l[i-1]!=d)
                     {for(j=1;j<=e;j++)
                     if(a[j]==l[i]&&b[j]+n==l[i-1])
                             y[++(*nr)]=j;}}}
while(1);}

int main()
{freopen("cmcm.in","r",stdin);
freopen("cmcm.out","w",stdout);
scanf("%d%d%ld\n",&n,&m,&e);
for(i=1;i<=n;i++)
for(j=n+1;j<=n+m;j++)
      {f[i][j]=c[i][j]=0;
      v[i][j]=INF;}
for(i=1;i<=e;i++)
      {scanf("%d%d%d",&a[i],&b[i],&h);
      c[a[i]][n+b[i]]=1;
      v[a[i]][n+b[i]]=h;}
t=ek(y,c,f,0,n+m+1,n,m,e,v,&nr);
printf("%ld %ld\n",nr,t);
for(i=1;i<=nr;i++)
      printf("%ld ",y[i]);      
fclose(stdin);
fclose(stdout);
return 0;}