Cod sursa(job #912377)

Utilizator wzrdwzrd tst wzrd Data 12 martie 2013 12:58:47
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
#include <algorithm>
#include <cstring>
#define DN 205
using namespace std;

typedef vector<int>::iterator it;

int n,m,fl[DN][DN],cap[DN][DN],pre[DN];
vector<int> gr[DN];
queue<int> c;
bitset<DN> viz;

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

int flow(int s, int d, int cap[DN][DN]) {
  memset(fl,0,sizeof(fl));
  int r=0;
  for(;bfs(s,d);) for(int i=0; i<=n; ++i) if(fl[i][d]<cap[i][d]){
    int cmin=cap[i][d]-fl[i][d];
    for(int y=i; pre[y]!=-1; cmin=min(cmin,cap[pre[y]][y]-fl[pre[y]][y]),y=pre[y]);
    r+=cmin;
    fl[i][d]+=cmin; fl[d][i]-=cmin;
    for(int y=i; pre[y]!=-1; fl[pre[y]][y]+=cmin,fl[y][pre[y]]-=cmin,y=pre[y]);
  }
  return r;
}

int fol[DN][DN],ind[DN][DN];

vector<int> rez;

int main()
{
    ifstream f("maxflow.in");
    ofstream g("maxflow.out");
    f>>n>>m;
    for(int i=1; i<=m; ++i) {
      int a,b,c;
      f>>a>>b>>c;
      ind[a][b]=ind[b][a]=i;
      gr[a].push_back(b);
     // gr[b].push_back(a);
      cap[a][b]=c;//=cap[b][a]=c;
    }

    g<<flow(1,n,cap);
    return 0;
}