Cod sursa(job #274551)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 9 martie 2009 20:43:47
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include<stdio.h>
#include<vector>
using namespace std;
FILE*fin=fopen("maxflow.in","r");
FILE*fout=fopen("maxflow.out","w");
#define nm 1005
#define pb push_back
#define inf 0x3f3f3f3f
#define min(a,b)((a)<(b)?(a):(b))
int n,m,q[nm],t[nm],viz[nm],c[nm][nm],f[nm][nm];
vector<int> g[nm];
inline int bf()
{
  q[0]=1;q[1]=1;
  int i=1,nod,nnod,j;
  for(j=1;j<=n;j++)
    viz[j]=0;
  while(i<=q[0])
  {
    nod=q[i];
    for(j=0;j<g[nod].size();j++)
    {
      nnod=g[nod][j];
      if((c[nod][nnod]-f[nod][nnod])&&!viz[nnod])
      {
        q[0]++;
        q[q[0]]=nnod;
        t[nnod]=nod;
        viz[nnod]=1;
        if(nnod==n) return 1;
      }
    }
    i++;
  }
  return 0;
}
int main()
{
    int flow=0,x,y,z,nod,i,fmin;
    fscanf(fin,"%d%d",&n,&m);
    memset(c,0,sizeof(c));
    memset(f,0,sizeof(f));
    for(i=1;i<=m;i++)
    {
      fscanf(fin,"%d%d%d",&x,&y,&z);
      g[x].pb(y);
      g[y].pb(x);
      c[x][y]=z;
    }  
    while(bf())
    {
      nod=n;
      fmin=inf;
      while(nod>1)
      {
        fmin=min(fmin,c[t[nod]][nod]-f[t[nod]][nod]);
        nod=t[nod];
      }
      nod=n;
      while(nod>1)
      {
        f[t[nod]][nod]+=fmin;
        f[nod][t[nod]]-=fmin;
        nod=t[nod];
      }
      flow+=fmin;
    }
    fprintf(fout,"%d",flow);
    fclose(fin);
    fclose(fout);
    return 0;
}