网络流--最大流--Dinic模板矩阵版(当前弧优化+非当前弧优化)
//非当前弧优化版
#include <iostream>
#include <cstdio>
#include <math.h>
#include <cstring>
#include <queue>
#define INF 0x3f3f3f3f
using namespace std;
int tab[250][250];//邻接矩阵
int dis[250];//距源点距离,分层图
int N,M;//N:点数;M,边数
queue<int> Q;
int BFS()
{memset(dis,0xff,sizeof(dis));//以-1填充dis[1]=0;Q.push(1);while (Q.size()){int head=Q.front();Q.pop();for (int i=1; i<=N; i++)if (dis[i]<0 && tab[head][i]>0){dis[i]=dis[head]+1;Q.push(i);}}if (dis[N]>0) return 1;else return 0;//汇点的DIS小于零,表明BFS不到汇点
}
//dfs代表一次增广,函数返回本次增广的流量,返回0表示无法增广
int dfs(int x,int low)//Low是源点到现在最窄的(剩余流量最小)的边的剩余流量
{int a=0;if (x==N)return low;//是汇点for (int i=1; i<=N; i++)if (tab[x][i] >0 //联通&& dis[i]==dis[x]+1 //是分层图的下一层&&(a=dfs(i,min(low,tab[x][i]))))//能到汇点(a != 0){tab[x][i]-=a;tab[i][x]+=a;return a;}return 0;}
int dinic()
{int ans=0,tans;while (BFS())//要不停地建立分层图,如果BFS不到汇点才结束{while(tans=dfs(1,0x7fffffff))ans+=tans;//一次BFS要不停地找增广路,直到找不到为止}return ans;
}
int main()
{int i,j,f,t,flow,tans;while (scanf("%d%d",&M,&N)!=EOF){memset(tab,0,sizeof(tab));for (i=1; i<=M; i++){scanf("%d%d%d",&f,&t,&flow);tab[f][t]+=flow;}printf("%d\n",dinic());}
}
//当前弧优化版
#include <iostream>
#include <cstdio>
#include <math.h>
#include <cstring>
#include <queue>
#define INF 0x3f3f3f3f
using namespace std;
int tab[250][250];//邻接矩阵
int dis[250];//距源点距离,分层图
int cur[280]; //当前弧优化
int N,M;//N:点数;M,边数
queue<int> Q;
int BFS()
{memset(dis,0xff,sizeof(dis));//以-1填充dis[1]=0;Q.push(1);while (Q.size()){int head=Q.front();Q.pop();for (int i=1; i<=N; i++)if (dis[i]<0 && tab[head][i]>0){dis[i]=dis[head]+1;Q.push(i);}}if (dis[N]>0) return 1;else return 0;//汇点的DIS小于零,表明BFS不到汇点
}
//dfs代表一次增广,函数返回本次增广的流量,返回0表示无法增广
int dfs(int x,int low)//Low是源点到现在最窄的(剩余流量最小)的边的剩余流量
{int a=0;if (x==N)return low;//是汇点for (int &i=cur[x]; i<=N; i++)if (tab[x][i] >0 //联通&& dis[i]==dis[x]+1 //是分层图的下一层&&(a=dfs(i,min(low,tab[x][i]))))//能到汇点(a != 0){tab[x][i]-=a;tab[i][x]+=a;return a;}return 0;}
int dinic()
{int ans=0,tans;while (BFS())//要不停地建立分层图,如果BFS不到汇点才结束{for(int i=1;i<=N;i++)cur[i]=1;while(tans=dfs(1,0x7fffffff))ans+=tans;//一次BFS要不停地找增广路,直到找不到为止}return ans;
}
int main()
{int i,j,f,t,flow,tans;while (scanf("%d%d",&M,&N)!=EOF){memset(tab,0,sizeof(tab));for (i=1; i<=M; i++){scanf("%d%d%d",&f,&t,&flow);tab[f][t]+=flow;}printf("%d\n",dinic());}
}
网络流--最大流--Dinic模板矩阵版(当前弧优化+非当前弧优化)相关推荐
- 图论 —— 网络流 —— 最大流 —— Dinic 算法
[概述] Dinic 算法在 EK 算法的基础上进行了优化,其时间复杂度为 O(n*n*m). Dinic 在找增广路的时也是找最短增广路, 但与 EK 算法不同的是 Dinic 算法并不是每次 bf ...
- hdu4280 Island Transport 网络流最大流 Dinic算法高效模板
Island Transport In the vast waters far far away, there are many islands. People are living on the i ...
- 网络流-最大流 dinic+当前弧优化(模板)
用法:在原有向图的基础上,增加源点s和汇点t,并将s与左子集建边,t与右子集建边: 边权都设为1,则就是求二分图最大匹配 右子集与t的边权大于1,则就是求二分图最大多重匹配 模板代码: const i ...
- 网络流最大流 Dinic算法模板
Dinic算法跟EK算法的优化地方就在于,EK是每次bfs记录前驱结点,然后从汇点找到一条回到源点的路. 而dinic是bfs记录深度,不断从源点dfs到汇点并且更新路径流量,直到dfs不到汇点. 邻 ...
- UESTC 1143 数据传输 网络流 最大流 Dinic
数据传输 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit Sta ...
- (通俗易懂小白入门)网络流最大流——EK算法
网络流 网络流是模仿水流解决生活中类似问题的一种方法策略,来看这么一个问题,有一个自来水厂S,它要向目标T提供水量,从S出发有不确定数量和方向的水管,它可能直接到达T或者经过更多的节点的中转,目前确定 ...
- 网络流最大流(FF、Dinic)详解
网络流24题题解戳这里~ 网络流基础概念 考虑这幅图,你可以看成从村庄s到村庄t有很多条物流道路,每个点都是个中转结点,每条路的权值即该条路最多能运送的货物 介绍一些基本概念: 网络:一个入度为0的点 ...
- 最大流算法模板:EK和dinic算法
最大流算法模板:EK和dinic算法 一.EK算法模板 #include<iostream> #include<queue> using namespace std; cons ...
- 网络流 费用流 模板 ISAP+SPFA+ZKW
2020年4月20日重新发布.7年前的文章,几年前CSDN改版的时候变成了私密--重新发一下吧. 关于费用流ZKW算法的讲解:从入门到精通: 最小费用流的"zkw算法" 关于Din ...
最新文章
- 温水里的程序员,技术将淘汰一切。
- 打家劫舍(不偷相邻)
- MySQL 清理slowlog方法
- ITK:计算图像谱密度
- 如何使用RichEdit
- Html5 Canvas斗地主游戏
- windows中当你的键盘无法使用时我们可以用另一种方法哦
- hive内置函数详解
- PHP spl_autoload_register()函数使用
- 通俗的解释交叉熵与相对熵
- portal认证 只能重定向80和443请求_华为防火墙内置Portal认证报文交互
- python学习笔记--python简介
- C# Winform开发教程
- 中国网络安全企业50强
- 【商业】梳理你的商业模式
- 服务器2016自动备份怎么取消,wps中ppt的制作怎样取消掉定时自动备份
- Spring MVC 项目中配置log4j 出现错误log4j:ERROR Failed to excute sql com.mysql.jdbc.exceptions.jdbc4.MySQLSynt
- 关于Mysql 的时区问题
- uniapp 实现销售订单页面-风格1
- linux进程的软中断通信del,linux进程的软中断通信