网络流(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 ...
随机推荐
- redis高级命令3哨兵模式
redis的哨兵模式 现在我们在从服务器1.222上让该从服务器作为哨兵 首先将redis安装包文件下的sentinel.conf文件复制到/usr/local/redis/etc目录下 然后修改se ...
- centos搭建nginx+fastdfs
软件地址 libfastcommon fastDFS fastdfs-nginx-module nginx 创建目录 mkdir -p /fastdfs/tracker mkdir -p /fastd ...
- 【C++和C#的区别杂谈】后自增运算符的结算时机
C++和C#的前自增++n和后自增n++,都是先自增后取值和先取值后自增的含义,但在复杂一点的赋值语句中,我发现细节上有很大的差异. 发现这个问题主要是一个无聊的晚上,我想搞清楚后自增是什么时候结算, ...
- CLR垃圾收集器
CLR GC是一种引用跟踪算法,大致步骤如下: 1.暂停进程中所有的线程: 2.标记阶段,遍历堆中的所有对象,标记为删除,然后检查所有活动根,如果有引用对象,就标记那个对象可达,否则不可达: 3.GC ...
- 搭建hadoop伪集群
基础设置:jdk.ssh. 1.操作系统.环境.网络.必须软件 2.关闭防火墙 3.设置hosts映射 4.时间同步 5.安装jdk 6.设置ssh免秘钥部署配置:初始化运行:命令行使用:
- SpringBoot--使用Spring Cache整合redis
一.简介 Spring Cache是Spring对缓存的封装,适用于 EHCache.Redis.Guava等缓存技术. 二.作用 主要是可以使用注解的方式来处理缓存,例如,我们使用redis缓存时, ...
- dart快速入门教程 (1)
1.环境搭建 1.1.dart简介 Dart 是一种 易于学习. 易于扩展.并且可以部署到 任何地方 的 应用 编程 语言.Google 使用 Dart 来开发 大型应用.flutter使用dart语 ...
- java中的四种访问权限是?
1.私有权限(private) private可以修饰数据成员,构造方法,方法成员,不能修饰类(此处指外部类,不考虑内部类).被private修饰的成员,只能在定义它们的类中使用,在其他类中不能调用. ...
- File and Code Templates IN IDEA
File and Code Templates (文件代码模板) 如何自定义设置头文件的注释,其中包括一些作者和文件创建时间和版本的设置 先打开File->Settings(或Alt+Ctrl+ ...
- iframe 透明兼容,设置iframe透明背景的方法
从IE5.5+就支持iframe框架的背景透明.通过使用allowtransparency和background-color来设置iframe框架的透明效果,代码如下: <iframe src= ...