Cod sursa(job #1692413)

Utilizator PTAdrian64Pop-Tifrea Adrian PTAdrian64 Data 20 aprilie 2016 20:17:57
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define nmax 1001
#define inf 0x3f3f3f3f

using namespace std;

int N,M,cap[nmax][nmax],F[nmax][nmax];
int cd[nmax],pred[nmax];
vector <int> G[nmax];
bool viz[nmax];

bool BFS(int s,int d){

  int v,nod,i,j;
  memset(viz,0,sizeof(viz));
  viz[s] = 1;
  cd[0] = 1;
  cd[1] = s;
  for(i = 1;i <= cd[0];i++){
    nod = cd[i];
    if(nod == d)continue;
    for(vector <int> :: iterator it = G[nod].begin();it != G[nod].end();++it){
      if(cap[nod][*it] == F[nod][*it] || viz[*it] == 1)continue;
      viz[*it] = 1;
      cd[++cd[0]] = *it;
      pred[*it] = nod;
    }
  }

  return viz[d];
  
}

int main(){

  freopen("maxflow.in","r",stdin);
  freopen("maxflow.out","w",stdout);

  scanf("%d %d ",&N,&M);
  int x,y,z;
  while(M--){
    scanf("%d %d %d ",&x,&y,&z);
    cap[x][y] = z;
    G[x].push_back(y);
    G[y].push_back(x);
  }

  int flow = 0,fmin,s = 1,d = N;
  while(BFS(s,d)){

    for(vector <int> :: iterator it = G[d].begin();it != G[d].end();++it){

      if(cap[*it][d] == F[*it][d] || viz[*it] == 0)continue;
      pred[d] = *it;

      fmin = inf;

      y = d;
      while(y != s){
	fmin = min(fmin,cap[pred[y]][y] - F[pred[y]][y]);
	y = pred[y];
      }

      if(fmin == 0)continue;

      y = d;
      while(y != s){
	F[pred[y]][y] += fmin;
	F[y][pred[y]] -= fmin;
	y = pred[y];
      }

      flow += fmin;
      
    }
    
  }

  printf("%d\n",flow);
  
  return 0;
  
}