Cod sursa(job #274723)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 9 martie 2009 22:29:19
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 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 inf 0x3f3f3f3f
#define pb push_back
#define min(a,b)((a)<(b)?(a):(b))
vector<int> g[nm];
int n,m, viz[nm],c[nm][nm],f[nm][nm],t[nm],q[nm];
inline int bf()
{
  int i,j,nod,nnod;
  memset(viz,0,sizeof(viz));
  q[0]=1;q[1]=1;i=1;
  while(i<=q[0])
  {
    nod=q[i];
    if(nod!=n)
    {
      for(j=0;j<g[nod].size();j++)
      {
        nnod=g[nod][j];
        if(!viz[nnod]&&(c[nod][nnod]-f[nod][nnod]))
        {
          viz[nnod]=1;
          t[nnod]=nod;
          q[0]++;
          q[q[0]]=nnod;
        }
      }  
    }
    i++;
  }
  return viz[n];
}
int main()
{
    int i,flow=0,fmin,x,y,z,nod;
    memset(c,0,sizeof(c));
    memset(f,0,sizeof(f));
    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);
    }
    while(bf())
      for(i=0;i<g[n].size();i++)
      {
        nod=g[n][i];
        if(viz[nod]&&(c[nod][n]-f[nod][n]))
        {
          t[n]=nod;
          nod=n;
          fmin=inf;
          while(nod>1)
          {
            fmin=min(fmin,c[t[nod]][nod]-f[t[nod]][nod]);
            nod=t[nod];
          }
          if(!fmin) continue;
          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;
}