网络流(dinic算法)
洛谷p3376 https://www.luogu.com.cn/problem/P3376
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn = 1000000 + 5;
int n,m,be,en;
queue<int>q;
int to[maxn];
int cost[maxn];
int head[maxn];
int nex[maxn];
int cnt;
void add(int x,int y,int z)
{
cnt++;
nex[cnt]=head[x]; //先把指针指向上次的位置
head[x]=cnt; //然后把头指向自己
to[cnt]=y;
cost[cnt]=z;
}
int level[maxn];
bool bfs() //深度打表(分层)
{
memset(level,-1,sizeof(level));
level[be]=0;
q.push(be);
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=head[u];i!=-1;i=nex[i])
{
int v=to[i];
if(cost[i]!=0&&level[v]==-1) //流量大于0并且未被访问
{
level[v]=level[u]+1;
q.push(v);
}
}
}
if(level[en]!=-1) return 1;
else return 0;
}
int dfs(int u,int flow) //dfs找最大流 对于源点,流入它的最大流量是无限大 flow最大可行流 ret剩余可行流量
{
if(u==en) return flow;
int ret=flow;
for(int i=head[u];i!=-1;i=nex[i])
{
if(ret<=0) break;
int v=to[i];
if(cost[i]!=0&&level[u]+1==level[v])
{
int k=dfs(v,min(ret,cost[i])); //把能流的都给下一个点
ret-=k;cost[i]-=k;cost[i^1]+=k; //i^1就是反向边
}
}
return flow-ret; //最大可行流减去剩余可行流就是实际流量
}
int dinic()
{
int ans=0;
while(bfs()==true) //还能分层就不断增广
{
ans+=dfs(be,INF);
}
return ans;
}
int main()
{
scanf("%d%d%d%d",&n,&m,&be,&en);
memset(head,-1,sizeof(head));
int x,y,z;
cnt=-1; //从0开始 0 1 一对 2 3 一对
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z); add(y,x,0);
}
printf("%d\n",dinic());
return 0;
}
网络流(dinic算法)的更多相关文章
- poj 1459 Power Network : 最大网络流 dinic算法实现
点击打开链接 Power Network Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 20903 Accepted: ...
- POJ 1273 Drainage Ditches(网络流dinic算法模板)
POJ 1273给出M条边,N个点,求源点1到汇点N的最大流量. 本文主要就是附上dinic的模板,供以后参考. #include <iostream> #include <stdi ...
- 网络流(dinic算法)
网络最大流(dinic) 模型 在一张图中,给定一个源点s,给定汇点t,点之间有一些水管,每条水管有一个容量,经过此水管的水流最大不超过容量,问最大能有多少水从s流到t(s有无限多的水). 解法 di ...
- 网络流Dinic算法
我的模板 例题: https://vjudge.net/problem/HDU-4280 struct Edge { int lst; int from; int to; int cap; int f ...
- 高效的网络流dinic算法模版
#include <cstring> #include <algorithm> #include <vector> #define Maxn 120010 #def ...
- POJ 3281 [网络流dinic算法模板]
题意: 农场主有f种食物,d种饮料,n头牛. 接下来的n行每行第一个数代表第i头牛喜欢吃的食物数量,和第i头牛喜欢喝的饮料数目. 接下来分别是喜欢的食物和饮料的编号. 求解:农场主最多能保证几头牛同时 ...
- 网络流Dinic算法模板 POJ1273
这就是以后我的板子啦~~~ #include <queue> #include <cstdio> #include <cstring> #include <a ...
- POJ 3281 网络流dinic算法
B - Dining Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit S ...
- [知识点]网络流之Dinic算法
// 此博文为迁移而来,写于2015年2月6日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vrg4.html ...
- 网络流入门—用于最大流的Dinic算法
"网络流博大精深"-sideman语 一个基本的网络流问题 最早知道网络流的内容便是最大流问题,最大流问题很好理解: 解释一定要通俗! 如右图所示,有一个管道系统,节点{1,2,3 ...
随机推荐
- 【秒懂Java】【第1章_初识Java】01_编程语言
各位小伙伴们好哇!从今日起,我将开始更新<秒懂Java>系列文章,从0开始讲解Java的方方面面,后面也将推出配套的视频版,欢迎大家保持关注! 我会尽力办到:在保证通俗易懂的同时,不丢失知 ...
- nginx web服务器概念了解 配置
服务器 服务器 服务器是一种提供高效计算的机器,与普通的PC主机相比,具有可观的稳定性,高并发性,可扩展性. 互联网任何一个应用都是以服务器为基础设施的,没有服务器我们就无法访问网络上的任何内容,只能 ...
- git和github入门指南(2.1)
2.git常用命令 2.1.git的三个区 1.工作区 工作区就是你项目所在目录,这个目录是可以非常直观的看到的,编写代码主要在这个目录进行,例如: 2.暂存区 暂存区从字面上去理解就是用来暂时保存项 ...
- 使用 Nginx 部署静态页面
Nginx 介绍 Nginx 是俄罗斯人编写的十分轻量级的 HTTP 服务器, Nginx,它的发音为「engine X」,是一个高性能的 HTTP 和反向代理服务器,同时也是一个 IMAP/ POP ...
- JavaScript基础Javascript中的循环(003)
1.普通循环JavaScript中一般的循环写法是这样的: // sub-optimal loop for (var i = 0; i < myarray.length; i++) { // d ...
- C# 自定义常用代码段快捷键
不断更新中... 分享地址:http://pan.baidu.com/s/15oE0X
- ELK安装 docker-compose.yml
version: '2.2' services: cerebro: image: lmenezes/cerebro:0.8.3 container_name: cerebro ports: - &qu ...
- 并发工具CyclicBarrier源码分析及应用
本文首发于微信公众号[猿灯塔],转载引用请说明出处 今天呢!灯塔君跟大家讲: 并发工具CyclicBarrier源码分析及应用 一.CyclicBarrier简介 1.简介 CyclicBarri ...
- 洛谷P5774,可爱的动态规划。
如此可爱的动态规划见过么? 相信各位都非常喜欢动态规划,那我就写一道可爱的动态规划的题解吧. 题目:https://www.luogu.com.cn/problem/P5774 题意: 题意“挺明白” ...
- CSS让一个图片显示在另一个图片上面
思路,在两个图片的父元素上设置 position:relative , 然后给小图片设置 position:absolute ,位置通过top,bottom,left,right来修改,然后用 ...