コード例 #1
0
int dinic(int nodes, int source, int sink) {
  int flow, max_flow = 0;
  while (dinic_bfs(nodes, source, sink)) {
    std::fill(ptr, ptr + nodes, 0);
    while ((flow = dinic_dfs(source, INF, sink)) != 0) {
      max_flow += flow;
    }
  }
  return max_flow;
}
コード例 #2
0
int dinic_dfs(int u, int f, int sink) {
  if (u == sink) {
    return f;
  }
  for (; ptr[u] < (int)adj[u].size(); ptr[u]++) {
    edge &e = adj[u][ptr[u]];
    if (dist[e.v] == dist[u] + 1 && e.f < e.cap) {
      int flow = dinic_dfs(e.v, std::min(f, e.cap - e.f), sink);
      if (flow > 0) {
        e.f += flow;
        adj[e.v][e.rev].f -= flow;
        return flow;
      }
    }
  }
  return 0;
}
コード例 #3
0
ファイル: dinic.cpp プロジェクト: anaechavarria/acm
flow[i^1]-=tmp; return tmp; } } return 0; } int dinic_flow() {
for (int i=0; i<nedge; ++i) flow[i] = 0; int result=0; while
(dinic_bfs()) { for (int i=0;i<node;i++) work[i]=head[i];
while (1) { int delta=dinic_dfs(src,oo); if (delta==0) break;
result+=delta; } } return result; }
コード例 #4
0
ファイル: dinic.cpp プロジェクト: anaechavarria/acm
dist[dest]>=0; } int dinic_dfs(int x,int exp) { if (x==dest)
return exp; for (int &i=work[x];i>=0;i=next[i]) { int
v=point[i],tmp; if (flow[i]<capa[i] && dist[v]==dist[x]+1 &&
(tmp=dinic_dfs(v,min(exp,capa[i]-flow[i])))>0) { flow[i]+=tmp;
flow[i^1]-=tmp; return tmp; } } return 0; } int dinic_flow() {