Cod sursa(job #1242922)

Utilizator S7012MYPetru Trimbitas S7012MY Data 15 octombrie 2014 11:37:11
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <fstream>
#include <vector>
#include <queue>
#define DN 1005
using namespace std;

typedef vector<int>::iterator it;

int n,m,fm,cap[DN][DN],fl[DN][DN],pre[DN];
vector<int> gr[DN];

bool bfs() {
  for(int i=2; i<=n; ++i) pre[i]=-1;
  queue<int> c;
  for(c.push(1); c.size(); c.pop()) {
    int fr=c.front();
    for(it i=gr[fr].begin(); i!=gr[fr].end(); ++i)
      if(-1==pre[*i] && cap[fr][*i]>fl[fr][*i]) {
        c.push(*i);
        pre[*i]=fr;
      }
  }
  return pre[n]!=-1;
}

int main() {
  ifstream f("maxflow.in");
  ofstream g("maxflow.out");
  f>>n>>m;
  for(;m--;) {
    int a,b,c; f>>a>>b>>c;
    cap[a][b]=c;
    gr[a].push_back(b); gr[b].push_back(a);
  }
  for(;bfs();) for(int i=1; i<n; ++i) if(cap[i][n]>fl[i][n] && pre[i]!=-1) {
    int fc=cap[i][n]-fl[i][n];
    for(int y=i; pre[y]; fc=min(fc,cap[pre[y]][y]-fl[pre[y]][y]),y=pre[y]);
    for(int y=i; pre[y]; fl[pre[y]][y]+=fc,fl[y][pre[y]]-=fc,y=pre[y]);
    fl[i][n]+=fc;
    fl[n][i]-=fc;
    fm+=fc;
  }
  g<<fm;
}