dinic 板子 洛谷p3376

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;
#define rep(i, l, r) for (int i = l; i <= r; i ++ )
#define clr(x, y) memset(x, y, sizeof (x))
const int INF = 0x3f3f3f3f;
const int N = 1e4+7, M = 2e5 + 7;
int h[M], cnt;
int n, m, s, t;
long long maxflow; // 
struct Node{
 int to, next, val;
}Edge[M];
void add(int u, int v, int val)
{
 Edge[cnt].to = v;
 Edge[cnt].next = h[u];
 Edge[cnt].val = val;
 h[u] = cnt ++;
}
int d[M], now[M];
queue<int> q;
bool bfs(){    // 在残量网络上构造分层图 
 clr(d, 0);
 while (q.size()) q.pop(); 
 q.push(s);
 d[s] = 1;
// now[s] = h[s];
 while (q.size()){
  int x = q.front(); q.pop();
  for (int i = h[x]; ~i; i = Edge[i].next){
   int w = Edge[i].val, v = Edge[i].to;
   if (w && !d[v]){
    q.push(v);
//    now[v] = h[v];
    d[v] = d[x] + 1;
    if (v == t) return true;
   }
  }
 }
 return false;
}
int dinic(int x, int flow){   // 当前分层图上增广 
 if(x == t) return flow;
 int rest = flow, k, i;
 for (i = h[x]; ~i && rest; i = Edge[i].next){
  int v = Edge[i].to, w = Edge[i].val;
  if (w && d[v] == d[x] + 1)
  {
   k = dinic(v, min(rest, w));
   if (!k) d[v] = 0;
   Edge[i].val -= k;
   Edge[i^1].val += k;
   rest -= k; 
  }
 } 
// now[x] = i;   没什么用 
 return flow - rest;
}
int main (){
 clr(h, -1);
 scanf ("%d%d%d%d", &n, &m, &s, &t);
 int i;
 rep(i, 1, m){
  int u, v, w;
  scanf ("%d%d%d", &u, &v, &w);
  add(u, v, w);
  add(v, u, 0);
 }
 int flow = 0;
 while (bfs())
  while (flow = dinic(s, INF)) maxflow += flow;
 printf ("%lld\n", maxflow); 
 return 0; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值