Cod sursa(job #241383)

Utilizator mihai_floreaFlorea Mihai Alexandru mihai_florea Data 9 ianuarie 2009 22:39:05
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
const int NMAX=1001;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int N,M,source,sink;
int c[NMAX][NMAX],r[NMAX][NMAX];
vector<int> G[NMAX],a;
queue<int> Q;
bool ok=true;
int t[NMAX],aug;
void BF(){
     int x;
     vector<int>::iterator it;
     aug=0;ok=false;
     memset(t,0,sizeof(t));
     Q.push(source);t[1]=1;
     while (!Q.empty()){
       x=Q.front();Q.pop();
       for (it=G[x].begin();it!=G[x].end();++it)
        if (!t[*it]) 
         if (r[x][*it]>0) t[*it]=x,Q.push(*it);}
     
     if (!t[sink]) return;
     ok=true;
     for (it=a.begin();it!=a.end();++it)
       if (r[*it][sink]>0){
         int rmin=r[*it][sink];
         for (x=*it;x!=source;x=t[x])
          rmin=min(rmin,r[t[x]][x]);
         aug+=rmin;
         r[*it][sink]-=rmin;
         r[sink][*it]+=rmin;
         for (x=*it;x!=source;x=t[x]){
           r[t[x]][x]-=rmin;
           r[x][t[x]]+=rmin;}
         }
     }
int flow(){
    int sol=0;
    while (ok){
      BF();
      sol+=aug;
      }
    return sol;
    }
int main(){
    int x,y,k;
    fin>>N>>M;
    source=1;sink=N;
    while (M--){
      fin>>x>>y>>k;
      G[x].push_back(y);
      G[y].push_back(x);
      r[x][y]=c[x][y]=k;
      if (y==sink) a.push_back(x);}
    fout<<flow();
    return 0;
}