Dinic板子Ver.1

就是EK的思想

#include<bits/stdc++.h>
#define MAXN 10005
using namespace std;

int n,m,s,t;
int tot = (-1) , h[MAXN] , dep[MAXN] , vis[MAXN];

struct node{
	int from,to,next,rest;
}e[MAXN * 20];

void add(int x , int y , int z){
	tot++;
	e[tot].from = x;
	e[tot].to = y;
	e[tot].rest = z;
	e[tot].next = h[x];
	h[x] = tot;
}

int bfs(){
	memset(dep , 0x3f , sizeof(dep));
	memset(vis , -1 , sizeof(vis));
	queue<int>q;q.push(s);dep[s] = 0;
	vis[s] = 1;int now;
	while(!q.empty()){
		now = q.front();vis[now] = (-1);q.pop();
		for(int i = h[now] ; i != (-1) ; i = e[i].next){
			if(!e[i].rest)continue;
			if(dep[e[i].to] < dep[now] + 1)continue;
			dep[e[i].to] = dep[now] + 1;
			if(vis[e[i].to] != (-1))continue;
			q.push(e[i].to);
		}
	}
	if(dep[t] > 999999)return (-1);
	return 1;
}

// dfsÕÒÿ´ÎµÄ·Ö²ã×î¶Ì·£¬²¢Çҵݹé¹ýÈ¥×îСֵ 
int dfs(int now , int dx){
	if(now == t)return dx;
	for(int i = h[now] ; i != (-1) ; i = e[i].next){
		if(e[i].rest && dep[e[i].to] == dep[now] + 1){
			int res = dfs(e[i].to , min(dx , e[i].rest));
			if(!res)continue;
			e[i].rest -= res;
			e[i ^ 1].rest += res;
			return res;
		}
	}
	return 0;
}

int dinic(){
	int maxl = 0;
	while(bfs() != (-1)){
		maxl += dfs(s , 99999999);
	}
	return maxl;
}

int main(){
	memset(h , -1 , sizeof(h));
	cin>>n>>m>>s>>t;
	for(int i = 1 ; i <= m ; i++){
		int x,y,z;
		scanf("%d%d%d" , &x , &y , &z);
		add(x , y , z);
		add(y , x , 0);
	}
	cout<<dinic()<<endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值