网络流 KM dinic
study from:
https://blog.csdn.net/A_Comme_Amour/article/details/79356220
1.
Edmonds-Karp 无优化
最坏时间复杂度O(n*m*m) n为点数,m为边数
- #include <cstdio>
- #include <cstdlib>
- #include <cmath>
- #include <ctime>
- #include <cstring>
- #include <string>
- #include <map>
- #include <set>
- #include <list>
- #include <queue>
- #include <stack>
- #include <vector>
- #include <bitset>
- #include <algorithm>
- #include <iostream>
- using namespace std;
- #define ll long long
- const int maxn=1e4+;
- const int inf=1e9;
- struct node
- {
- int d,len;
- node *next,*opp;
- }*e[maxn],*pre[maxn];
- int sum=,s,t,add[maxn];
- queue<int> st;
- bool vis[maxn];
- void add_edge(int x,int y,int len)
- {
- node *p1=(node*) malloc (sizeof(node));
- node *p2=(node*) malloc (sizeof(node));
- p1->d=y;
- p1->len=len;
- p1->next=e[x];
- p1->opp=p2;
- e[x]=p1;
- p2->d=x;///注意
- p2->len=;///注意
- p2->next=e[y];
- p2->opp=p1;
- e[y]=p2;
- }
- void bfs()
- {
- int d,dd,v;
- node *p;
- while ()
- {
- memset(add,,sizeof(add));
- ///vis不用初始化
- add[s]=inf;
- vis[s]=;
- st.push(s);
- while (!st.empty())
- {
- d=st.front();
- st.pop();
- p=e[d];
- while (p)
- {
- dd=p->d;
- v=min(add[d],p->len);
- if (add[dd]<v)
- {
- add[dd]=v;
- pre[dd]=p->opp;
- if (!vis[dd])
- {
- vis[dd]=;
- st.push(dd);
- }
- }
- p=p->next;
- }
- vis[d]=;
- }
- if (add[t]==)
- break;
- sum+=add[t];
- d=t;
- while (d!=s)
- {
- pre[d]->len+=add[t];
- pre[d]->opp->len-=add[t];
- d=pre[d]->d;
- }
- }
- }
- int main()
- {
- int n,m,x,y,z;
- scanf("%d%d%d%d",&n,&m,&s,&t);
- while (m--)
- {
- scanf("%d%d%d",&x,&y,&z);
- add_edge(x,y,z);
- }
- bfs();
- printf("%d",sum);
- return ;
- }
2.
study from https://www.luogu.org/problemnew/solution/P3376 第一个题解的dinic
dinic
- #include <cstdio>
- #include <cstdlib>
- #include <cmath>
- #include <ctime>
- #include <cstring>
- #include <string>
- #include <map>
- #include <set>
- #include <list>
- #include <queue>
- #include <stack>
- #include <vector>
- #include <bitset>
- #include <algorithm>
- #include <iostream>
- using namespace std;
- #define ll long long
- const int maxn=1e4+;
- const int inf=1e9;
- struct node
- {
- int d,len;
- node *next,*opp;
- }*e[maxn];
- int sum=,s,t;
- int q[maxn],dep[maxn];
- bool vis[maxn];
- void add_edge(int x,int y,int len)
- {
- node *p1=(node*) malloc (sizeof(node));
- node *p2=(node*) malloc (sizeof(node));
- p1->d=y;
- p1->len=len;
- p1->next=e[x];
- p1->opp=p2;
- e[x]=p1;
- p2->d=x;
- p2->len=;///注意
- p2->next=e[y];
- p2->opp=p1;
- e[y]=p2;
- }
- ///前面的网络流算法,每进行一次增广,都要做 一遍BFS,十分浪费。能否少做几次BFS?
- bool bfs()
- {
- int head=,tail=,d,dd;
- node *p;
- memset(vis,,sizeof(vis));
- vis[s]=;
- dep[s]=;
- q[]=s;
- while (head<tail)
- {
- head++;
- d=q[head];
- p=e[d];
- while (p)
- {
- dd=p->d;
- if (p->len> && !vis[dd])
- {
- tail++;
- q[tail]=dd;
- vis[dd]=;
- dep[dd]=dep[d]+;
- }
- p=p->next;
- }
- }
- if (vis[t])
- return ;
- return ;
- }
- ///DFS找到一条增广路径后,并不立即结束,而是回溯后继续DFS寻找下一个增广路径
- int dfs(int d,int add)
- {
- if (!add || d==t)
- return add;
- int totf=,f,dd;
- node *p=e[d];
- while (p)
- {
- dd=p->d;
- if (dep[dd]==dep[d]+ && (f=dfs(dd,min(add,p->len)))>)///注意
- {
- totf+=f;
- add-=f;///注意
- p->len-=f;
- p->opp->len+=f;
- }
- p=p->next;
- }
- return totf;
- }
- int main()
- {
- int n,m,x,y,z;
- scanf("%d%d%d%d",&n,&m,&s,&t);
- while (m--)
- {
- scanf("%d%d%d",&x,&y,&z);
- add_edge(x,y,z);
- }
- while (bfs())
- sum+=dfs(s,inf);
- printf("%d",sum);
- return ;
- }
网络流 KM dinic的更多相关文章
- [知识点]网络流之Dinic算法
// 此博文为迁移而来,写于2015年2月6日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vrg4.html ...
- [无效]网络流之Dinic算法
// 此博文为迁移而来,写于2015年2月6日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vrg4.html UPDA ...
- 「CODVES 1922 」骑士共存问题(二分图的最大独立集|网络流)&dinic
首先是题目链接 http://codevs.cn/problem/1922/ 结果发现题目没图(心情复杂 然后去网上扒了一张图 大概就是这样了. 如果把每个点和它可以攻击的点连一条边,那问题就变成了 ...
- 初涉网络流[EK&dinic]
主要还是板子 Edmonds-Karp 从S开始bfs,直到找到一条到达T的路径后将该路径增广,并重复这一过程. 在处理过程中,为了应对“找到的一条路径把其他路径堵塞”的情况,采用了建反向弧的方式来实 ...
- 网络流之Dinic算法
初学网络流.存一下Dinic板子. 复杂度O(n^2*m) UVA - 1515 Pool construction 把每个草地与 S 相连,花费为dig,每个洞与 T 相连,花费为 然后对于每个两个 ...
- 网络流 之 dinic 算法
网络流指的是:网络流(network-flows)是一种类比水流的解决问题方法.(类似于水管群,有一个源点(水无限多),和一个汇点,最大流就代表这个点水管群(边集)每秒最大能送道汇点的水量) 这个怎么 ...
- 初探网络流:dinic/EK算法学习笔记
前记 这些是初一暑假的事: "都快初二了,连网络流都不会,你好菜啊!!!" from 某机房大佬 to 蒟蒻我. flag:--NOIP后要学网络流 咕咕咕------------ ...
- Secret Milking Machine POJ - 2455 网络流(Dinic算法---广搜判断+深搜增广)+时间优化+二分
题意: 第一行输入N M C ,表示从1到N有M条无向边,现在要从1走到N 走C次完全不同的路径,求最长边的最小值.下面M行是从a点到b点的距离. 建图: 题上说从两点之间可以有多条边,问的是从1~N ...
- 【模板】【网络流】Dinic
/* 唐代杜荀鹤 <小松> 自小刺头深草里,而今渐觉出蓬蒿. 时人不识凌云木,直待凌云始道高. */ #include <iostream> #include <cstd ...
随机推荐
- Java多线程的使用以及原理
Java有两种方式实现多线程. 第一种——继承Thread类,并重写run方法 步骤: 定义类继承Thread类: 重写子类的run方法,将线程需要执行的代码写在run方法中: 创建子类的对象,则创建 ...
- Scrum Meeting day 4
第四次会议 No_00:工作情况 No_01:任务说明 待完成 已完成 No_10:燃尽图 No_11:照片记录 待更新 No_100:代码/文档签入记录 No_101:出席表 ...
- 《Linux内核设计与实现》读书笔记三
Chapter 18 调 试 18.1 准备开始 1.准备工作: 一个bug 一个藏匿bug的内核版本 相关内核代码的知识和运气 2.执行foo就会让程序立即产生核心信息转储(dump core). ...
- html5制作导航条
(1)background-repeat:no-repeat;图片不平铺 (2)使用<ul>和<li>便签,代码简介有序.易于编排. (3)在引入外部css文件时,<li ...
- 《面向对象程序设计》c++第五次作业___calculator plus plus
c++第五次作业 Calculator plusplus 代码传送门 PS:这次作业仍然orz感谢一位同学与一位学长的windows帮助,同时再次吐槽作业对Mac系统用户的不友好.(没朋友千万别用Ma ...
- Apache+php安装和配置 windows
Apache+php安装和配置 windows Apache 安装 1.官网网址:http://httpd.apache.org/ 2.Download 3.点击链接Files for Microso ...
- Jquery Jquery对象和DOM对象的微妙联系
声明变量 var $variable= Jquery 对象: var varibake= DOM对象: var $cr= $("#id&q ...
- ubuntu ftp服务
apt-get install vsftpd apt-get update vi /etc/apt/sources.list vim /etc/vsftpd.conf service vsftpd ...
- BOM嵌套简单写法
WITHTREE AS( SELECT a.FItemID cfitemid,b.FItemID pfitemid FROM dbo.ICBOMChild a,dbo.ICBOM b WHERE a. ...
- std::string 字符串替换
std::string 没有原生的字符串替换函数,需要自己来完成 string& replace_str(string& str, const string& to_repla ...