ホームに戻る
最大流量問題

// スタートからゴールへの最大流量を求める。
// NN は最大の頂点数とする。
// NN は使わなければ -1 にすれば良いので十分量が良い。
// v[from][to]にグラフ情報を入れる。
// 使わない辺は -1 とする。
// ae(from, to, cost) で枝を登録(片側のみ)。
// flow(from, to, volumes) で量を流す。

#define NN 50
#define INF 1000000000000000000LL

long long v[NN][NN];
long long flag[NN];

long long flow(long long s, long long e, long long f){
  if(s == e)return f;

  flag[s] = 1;

  for(long long i = 0; i < NN; i++){
    if(v[s][i] > 0 && flag[i] == 0){
      long long d = flow(i, e, min(f, v[s][i]));
      if(d > 0){
        v[s][i] -= d;
        v[i][s] += d;
        return d;
      }
    }
  }
  return 0;
}

void ae(long long from, long long to, long long cost){
  v[from][to] = cost;
}

int main(){
  memset(v,-1,sizeof(v));

  ae(0,1,1); // 0 から 1 へ容量 1 で流せる
  ae(1,2,2); // 1 から 2 へ容量 2 で流せる

  long long ans = 0;

  for(;;){
    memset(flag,0,sizeof(flag));

    // 0 から 2 へ INF 流す
    long long f = flow(0, 2, INF);
    if(f == 0)break;
    ans += f;
  }

  std::cout << ans << std::endl;

  return 0;
}

inserted by FC2 system