网络流(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 ...
随机推荐
- Git【入门】这一篇就够了
前言 欢迎关注公众号,白嫖原创PDF,也可以催更,微信搜:JavaPub,回复:[666] Git 在生产工作中是使用频率很高的工具,但我发现很多文章只是对它做了简单的提交命令说明,真正遇到 版本冲突 ...
- Python实用笔记 (19)面向对象编程——访问限制
在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑. 但是,从前面Student类的定义来看,外部代码还是可以自由地修改一个实例的na ...
- MongoDB快速入门教程 (3.3)
3.4.聚合 3.4.1.什么是聚合? MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*) 例如上图 ...
- Buy a Ticket 【最短路】
题目 Musicians of a popular band "Flayer" have announced that they are going to "make t ...
- Jquery的一些方法
$.trim(str);说明:去掉字符串首尾空格.
- Net链接Sql Server语法
1.登录名.密码链接 </system.web> <appSettings> <!--<add key="MSSqlConnectionString&qu ...
- CountDownLatch和CyclicBarrier 傻傻的分不清?超长精美图文又来了
你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough ...
- asp.net core 发布包含文件
这样这个文件在发布的时候,就会包含进去了.
- SQL注入原理及代码分析(二)
前言 上一篇文章中,对union注入.报错注入.布尔盲注等进行了分析,接下来这篇文章,会对堆叠注入.宽字节注入.cookie注入等进行分析.第一篇文章地址:SQL注入原理及代码分析(一) 如果想要了解 ...
- C#数据类型及其转换详解
前言 在 C# 中,数据类型可以分为以下几种类型: 值类型(Value types) 引用类型(Reference types) 指针类型(Pointer types) 其中指针类型只在不安全代码下使 ...