Cod sursa(job #596161)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 16 iunie 2011 09:34:37
Problema Cuplaj maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include<fstream.h>
#define INF 1000000
#define E 50001
#define N 606
int n,m,c[N][N]={{0}},f[N][N]={{0}},z,i,a[E],b[E],pre[N],p,q,t,l,nr=0,y;
long k,v[N][N],e=0,x[E],que[INF],g[N];
int main()
{ifstream j("cmcm.in");
ofstream h("cmcm.out");
j>>n>>m>>k;     
for(i=1;i<=k;i++)
     {j>>a[i]>>b[i]>>z;
     c[a[i]][b[i]+n]=1,c[b[i]+n][a[i]]=0;
     v[a[i]][b[i]+n]=z,v[b[i]+n][a[i]]=-z;}
for(i=1;i<=n+m;i++)
if(i<=n)
     v[0][i]=0,c[0][i]=1;
else
     v[i][n+m+1]=0,c[i][n+m+1]=1;
while(1)      
       {for(i=1;i<=n+m+1;i++)
               pre[i]=0,g[i]=INF;
       g[0]=p=q=0;
       que[q++]=0;
       while(p<q)
               {t=que[p++];
               for(i=1;i<=n+m+1;i++)
               if(f[t][i]<c[t][i]&&g[i]>g[t]+v[t][i])
                       que[q++]=i,pre[i]=t,g[i]=g[t]+v[t][i];}
       if(!pre[n+m+1])
               break;
       for(l=n+m+1;l;l=pre[l])
               f[pre[l]][l]++,f[l][pre[l]]--;
       e+=g[n+m+1];}
for(i=1;i<=k;i++)
if(f[a[i]][b[i]+n]==1)
       x[++nr]=i;
h<<nr<<" "<<e<<'\n';
for(i=1;i<=nr;i++)
       h<<x[i]<<" ";    
fclose(stdin);
fclose(stdout);
return 0;}