Cod sursa(job #424833)

Utilizator mihaionlyMihai Jiplea mihaionly Data 25 martie 2010 11:17:52
Problema Cuplaj maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include <cstdio>
#include <cstring>
using namespace std;
#define inf 1<<18
#define nmax 604
FILE *f=fopen("cmcm.in","r");
FILE *fout=fopen("cmcm.out","w");
int n,m,e;
int M[nmax][nmax];
int Q[3000],k;
bool viz[nmax];
int drum[nmax],pre[nmax];
struct graf
 {
 int x,c;
 graf *urm;
 };
graf *G[nmax];
int C[nmax][nmax],F[nmax][nmax];
void add(graf *&g,int x,int c)
 {
 graf *p=new graf;
 p->x=x;
 p->c=c;
 p->urm=g;
 g=p;
 }
void read()
 {
 int i,x,y,c;
 fscanf(f,"%d %d %d",&n,&m,&e);
 for(i=1;i<=n;i++)
  {
  add(G[0],i,0);
  C[0][i]=1;
  }
 for(i=1;i<=m;i++)
  {
  add(G[n+i],n+m+1,0);
  C[n+i][n+m+1]=1;
  }
 for(i=1;i<=e;i++)
  {
  fscanf(f,"%d %d %d",&x,&y,&c);
  M[x][n+y]=i;
  add(G[x],n+y,c);
  add(G[n+y],x,-c);
  C[x][n+y]=1;
  }
 }
inline int min(int x,int y)
 {
 if(x<y) return x;
 return y;
 }
bool BF()
 {
 k=-1;
 int c=3;
 int i,x;
 Q[++k]=0;
 for(i=0;i<=n;i++){drum[i]=inf;pre[i]=-1;}
 drum[0]=0;
 viz[0]=true;

 for(i=0;i<=k;i++)
  {
  x=Q[i];
  for(graf *g=G[x];g!=NULL;g=g->urm)
   {
   if(C[x][g->x]-F[x][g->x]>0&&drum[g->x]>drum[x]+g->c)
    {
    drum[g->x]=drum[x]+g->c;
	pre[g->x]=x;
	if(!viz[g->x])
	 {
	 viz[g->x]=true;
	 Q[++k]=g->x;
	 }
    }
   }
  viz[x]=false;
  }
 for(i=n;pre[i]!=-1;i=pre[i])
  c=min(c,C[pre[i]][i]-F[pre[i]][i]);
 for(i=n;pre[i]!=-1;i=pre[i])
  {
  F[pre[i]][i]+=c;
  F[i][pre[i]]-=c;
  }
 return drum[n]!=inf;
 }
void flux()
 {
 bool drum=false;
 do
  {
  drum=BF();
  }while(drum);
 }
void show()
 {
 long long cost=0;
 int nv=0;
 int i;
 for(i=1;i<=n-m-1;i++)
  for(graf *g=G[i];g!=NULL;g=g->urm)
   {
   if(F[i][g->x])
    {
    ++nv;
	cost+=g->c;
    }
   }
 fprintf(fout,"%d %lld\n",nv,cost);
 for(i=1;i<=n-m-1;i++)
  for(graf *g=G[i];g!=NULL;g=g->urm)
   {
   if(F[i][g->x])
    fprintf(fout,"%d ",M[i][g->x]);
   }
 }
int main()
 {
 read();
 n=n+m+1;
 flux();
 show();
 return 0;
 }