Cod sursa(job #552118)

Utilizator mihaionlyMihai Jiplea mihaionly Data 11 martie 2011 17:45:05
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <cstdio>
#include <cstring>
using namespace std;
FILE *fin=fopen("maxflow.in","r");
FILE *fout=fopen("maxflow.out","w");
#define NMAX 1001
struct graf {
	int x;
	graf *urm;
}*G[NMAX];
int C[NMAX][NMAX],F[NMAX][NMAX];
int n,m;
int Q[NMAX],K,pre[NMAX],fluxul;
bool viz[NMAX];
inline int min(int x,int y)
 {
 if(x<y) return x;
 return y;
 }
void add(graf *&g,int x)
 {
 graf *p=new graf;
 p->x=x;
 p->urm=g;
 g=p;
 }
bool bfs()
 {
 K=0;
 int i,x;
 Q[++K]=1;
 memset(viz,false,sizeof(viz));
 memset(pre,0,sizeof(pre));
 viz[1]=true;
 for(i=1;i<=K;i++)
  {
  x=Q[i];
  if(x==n) 
   continue;
  for(graf *g=G[x];g!=NULL;g=g->urm)
   {
   if(F[x][g->x]<C[x][g->x]&&!viz[g->x])
    {
	Q[++K]=g->x;
	viz[g->x]=true;
	pre[g->x]=x;
    }
   }
  }
 return viz[n];
 }
void flux()
 {
 int i,cm,x;
 while(bfs())
  {
  for(graf *g=G[n];g!=NULL;g=g->urm)
   {
   x=g->x;
   if(!viz[x]||C[x][n]==F[x][n]) 
	continue;
   cm=2891821;
   pre[n]=x;
   for(i=n;pre[i]!=0;i=pre[i])
    cm=min(cm,C[pre[i]][i]-F[pre[i]][i]);
   if(cm==0)
	continue;
   for(i=n;pre[i]!=0;i=pre[i])
    {
    F[pre[i]][i]+=cm;
    F[i][pre[i]]-=cm;
    }
   fluxul+=cm;
   }
  }
 }
int main()
 {
 fscanf(fin,"%d %d",&n,&m);
 int i,x,y,c,xm=0;
 for(i=1;i<=m;i++)
  {
  fscanf(fin,"%d %d %d",&x,&y,&c);
  add(G[x],y);
  add(G[y],x);
  C[x][y]=c;
  }
 flux();
 
 fprintf(fout,"%d",fluxul);
 return 0;
 }