Cod sursa(job #1480855)

Utilizator EdyOnuEdy Onu EdyOnu Data 3 septembrie 2015 11:51:34
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <utility>
#define NMAX 1001
#define oo 1000000
using namespace std;
vector< int >G[NMAX];
int C[NMAX][NMAX];
int n,m,S,D;
void ReadGraph()
{FILE *fin=fopen("maxflow.in","r");
 fscanf(fin,"%d %d",&n,&m);
 S=1,D=n;
 for(int i=1;i<=m;++i)
 {int x,y,c;
  fscanf(fin,"%d%d%d",&x,&y,&c);
  G[x].push_back(y);
  G[y].push_back(x);
  C[x][y]=c;
 }
 fclose(fin);
}

int Flow[NMAX][NMAX];
int Viz[NMAX];
queue<int>Q;

bool Edmuds_Krap()
{vector<int>::iterator it;
 for(int i=1;i<=n;++i)Viz[i]=false;
 Viz[S]=-1;
 Q.push(S);
 while(!Q.empty()&&!Viz[D])
 {int x=Q.front();
  for(it=G[x].begin();it!=G[x].end();++it)
   if(!Viz[*it]&&C[x][*it]-Flow[x][*it]>0)
   {Viz[*it]=x;
    Q.push(*it);
   }
  Q.pop();
 }
 while(!Q.empty())Q.pop();
 return Viz[D];
}

void Ford_Fulkenson()
{int Flux=0;
 while(Edmuds_Krap())
 {int mini=oo;
  for(int i=D;i!=S;i=Viz[i])mini=min(mini,C[Viz[i]][i]-Flow[Viz[i]][i]);
  for(int i=D;i!=S;i=Viz[i])
  {Flow[Viz[i]][i]+=mini;
   Flow[i][Viz[i]]=(-1)*Flow[Viz[i]][i];
  }
  Flux+=mini;
 }
FILE *fout=fopen("maxflow.out","w");
fprintf(fout,"%d",Flux);
fclose(fout);
}

int main()
{ReadGraph();
 Ford_Fulkenson();

 return 0;
}