Cod sursa(job #316670)

Utilizator mlazariLazari Mihai mlazari Data 20 mai 2009 18:27:24
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include<stdio.h>
#define NMAX 1003
#define INF 1000000

struct lista {
  int x;
  lista *next;
};

lista *v[NMAX];
int n,m,flow,f[NMAX][NMAX],c[NMAX][NMAX],viz[NMAX],q[NMAX],t[NMAX];

void adauga(lista* &l,int x) {
  lista *q=new lista;
  q->x=x;
  q->next=l;
  l=q;
}

void citeste() {
  int x,y,z,i;
  freopen("maxflow.in","r",stdin);
  scanf("%d%d",&n,&m);
  for(i=1;i<=n;i++) v[i]=NULL;
  for(i=0;i<m;i++) {
    scanf("%d%d%d",&x,&y,&z);
    adauga(v[x],y);
    adauga(v[y],x);
    c[x][y]=z;
    //c[y][x]=0;
    //f[x][y]=f[y][x]=0;
  }
  fclose(stdin);
}

int BFS() {
  int i,nod;
  lista *l;
  viz[1]=1;
  for(i=2;i<=n;i++) viz[i]=0;
  q[0]=1;
  q[1]=1;
  for(i=1;i<=q[0];i++) {
    nod=q[i];
    if(nod==n) continue;
    for(l=v[nod];l;l=l->next) {
      if(viz[l->x]||(f[nod][l->x]==c[nod][l->x])) continue;
      viz[l->x]=1;
      q[++q[0]]=l->x;
      t[l->x]=nod;
    }
  }
  return viz[n];
}

void scrie() {
  freopen("maxflow.out","w",stdout);
  printf("%d",flow);
  fclose(stdout);
}

int main() {
  lista *l;
  int fmin,nod;
  citeste();
  for(flow=0;BFS();) {
    for(l=v[n];l;l=l->next) {
      if(f[l->x][n]==c[l->x][n]) continue;
      t[n]=l->x;
      fmin=INF;
      for(nod=n;nod!=1;nod=t[nod])
       if(c[t[nod]][nod]-f[t[nod]][nod]<fmin) fmin=c[t[nod]][nod]-f[t[nod]][nod];
      flow+=fmin;
      for(nod=n;nod!=1;nod=t[nod]) {
        f[t[nod]][nod]+=fmin;
        f[nod][t[nod]]-=fmin;
      }
    }
  }
  scrie();
  return 0;
}