Cod sursa(job #274604)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 9 martie 2009 21:16:58
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include<stdio.h>
#include<vector>
#include<string>
using namespace std;
FILE*fin=fopen("maxflow.in","r");
FILE*fout=fopen("maxflow.out","w");
#define nm 1005
#define inf 0x3f3f3f3f
#define pb push_back
vector<int> g[nm];
int n,m,viz[nm],q[nm],c[nm][nm],f[nm][nm],t[nm];
inline int bf()
{
    int i,j,nod,nnod;
    q[0]=1;q[1]=1;i=1;
    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])
        {
          viz[nnod]=1;
          q[0]++;
          q[q[0]]=nnod;
          t[nnod]=nod;
          if(nnod==n) return 1;
        }
      }
      i++;
    }
    return 0;
}
int main()
{
    int i,x,y,z,flow,nod,fmin;
    fscanf(fin,"%d%d",&n,&m);
    for(i=1;i<=m;i++)
    {
      fscanf(fin,"%d%d%d",&x,&y,&z);
      c[x][y]=z;
      g[x].pb(y);
      g[y].pb(x);
    }
    flow=0;
    while(bf())
    {
      fmin=inf;
      nod=n;
      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;
}