网络流

图论--网络流--费用流--POJ 2156 Minimum Cost

ⅰ亾dé卋堺 提交于 2019-11-26 18:16:39
Description Dearboy, a goods victualer, now comes to a big problem, and he needs your help. In his sale area there are N shopkeepers (marked from 1 to N) which stocks goods from him.Dearboy has M supply places (marked from 1 to M), each provides K different kinds of goods (marked from 1 to K). Once shopkeepers order goods, Dearboy should arrange which supply place provide how much amount of goods to shopkeepers to cut down the total cost of transport. It's known that the cost to transport one unit goods for different kinds from different supply places to different shopkeepers may be different.

图论--网络流最大流问题

北城以北 提交于 2019-11-26 18:15:52
问题表述: 给定一幅图(n个结点,m条边),每一条边有一个容量,现在需要将一些物品从结点s(称为源点)运送到结点t(称为汇点),可以从其他结点中转,求最大的运送量。 在介绍最大流问题的解决方法之前,先介绍几个概念. 网络 :网络是一个有向带权图,包含一个源点和一个汇点,没有反向平行边。 网络流 :网络流即网上的流,是定义在网络边集E上的一个非负函数flow={flow(u,v)}, flow(u,v)是边上的流量。 可行流 :满足以下两个性质的网络流flow称为可行流。 容量约束 :每条边的实际流量不能超过改变的最大流量。 流量守恒 :除了源点s和汇点t之外,所有内部节点流入量等于流出量。 源点s :源点主要是流出,但也有可能流入。 源点的净输出值=流出量之和-流入量之和。 汇点t :汇点主要是流入,但也有可能流出。 汇点的净输入值=流入量之和-流出量之和。 对于一个网络可行流flow,净输出等于净输入,这仍然是流量守恒。 网络最大流 :在满足容量约束和流量守恒的前提下,在流网络中找到一个净输出最大的网络流。 反向弧: 若从u到v的边的 容量 为c ,这条边上有流量 f 流过(称为正向弧),则相当于v到u有一条容量为0的边,其流量为- f ,这条边就是反向弧。反向弧的作用主要是用于寻找增广路。 反向弧的意义: 反向弧的作用是起到有更优 决策 的时候会使当前选择的弧会自动放弃

经典网络流题目模板(P3376 + P2756 + P3381 : 最大流 + 二分图匹配 + 最小费用最大流)

落爺英雄遲暮 提交于 2019-11-26 18:12:59
题目来源 P3376 【模板】网络最大流 P2756 飞行员配对方案问题 P3381 【模板】最小费用最大流 最大流 最大流问题是网络流的经典类型之一,用处广泛,个人认为网络流问题最具特点的操作就是建反向边,这样相当于给了反悔的机会,不断地求增广路的,最终得到最大流 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<queue> #include<string> #include<fstream> #include<vector> #include<stack> #include <map> #include <iomanip> #define bug cout << "**********" << endl #define show(x,y) cout<<"["<<x<<","<<y<<"] " //#define LOCAL = 1; using namespace std; typedef long long ll; const int inf = 0x3f3f3f3f; const ll mod = 1e6 + 3; const int Max = 1e5 + 10; struct Edge { int to, next, flow; /

模板整理: 图论---网络流/最小费用最大流

不羁岁月 提交于 2019-11-26 18:10:55
NOIp……应该不会考这东西吧QAQ 考了感觉药丸。。 还是整一个比较好~ 网络流有个特点就是,最坏的上界一般都是达不到的。 1.FF 思路是每次增广1的流量,很慢的,因为容量一般挺大, 没写过,就没模板了。。O( | f | ∗ m //--> )(似乎是,有点忘了) 2.EK 思路是随意找一条增广路径,然后增广即可。 最坏O( m 2 n //--> )。 就写过一次……还是早期写的……真是有点丑的。。 bool EdKa( int src, int des, int n) { int v,i,head,tail; memset (visit, 0 , sizeof (visit)); head=tail= 0 ; Q[tail++]=src; visit[src]= true ; while (head!=tail) { v=Q[head++]; for (i= 1 ;i<=n;i++) if (!visit[i] && map [v][i]) { Q[tail++]=i; visit[i]= true ; pre[i]=v; if (i==des) return true ; } } return false ; } int maxflow( int src, int des, int n) { int i,_min,sum= 0 ; while ( true ) { if

网络流--最小费用最大流 (理解)

天涯浪子 提交于 2019-11-26 17:42:50
1、什么是最小费用最大流问题    上篇文章我们讲解了最大流问题,那什么是最小费用最大流呢?听名字就可以看出,我们要在满足最大流的同时找到达成最大流的最小费用。 对于一个网络流,最大流是一定的,但是组成最大流的费用是可以不同的,这里就有了在最大流网络上产生的费用流网络,就有了最小花费问题。   简单来说,就是满足最大流的路径可能有多条,我们要从这多条路径中找到一条花费代价最小的路径。所以最大流是解决这类问题的前提 2、EK算法 + SPFA 最短路    我们用每条边单位流量的花费作为边权,假如一条合法路径上每条边的花费分别为 c1,c2,.......ck , 并且这条边上的最小流量为flow,   那么这条路径上的花费为 : c1 * flow + c2*flow + ..... + ck*flow = (c1+ c2 + c3 + .... + ck)*flow = dis [ci] * flow   这里的 dis[ci] 就是我们要求的最短路! 3、算法思想   采用贪心的思想,每次找到一条从源点到达汇点的路径,增加流量,且该条路径满足使得增加的流量的花费最小,直到无法找到一条 从源点到达汇点的路径,算法结束。 由于最大流量有限,每执行一次循环流量都会增加,因此该算法肯定会结束,且同时流量也必定会达到网络的最大流量;同时由于每次都是增加的最小的花 费

网络流-费用流(dijkstra写法)

眉间皱痕 提交于 2019-11-26 17:32:43
模板提 P3381 【模板】最小费用最大流 个人简述 首先呢,dijkstra算法求费用流是不如spfa求费用流的,因为这个题目不开O2优化,就过不去.... 那么我们为什么要用这个算法呢?个人认为确实没什么用....还是用spfa或者zkw求费用流吧 总所周知,dijkstra是不能跑有负环的图的,而我们在求最小费用流的过程中一般会存在负环(反边的存在),因此我通过引入势的概念,将图的边用 e' 代替,其中 e' = e + h[u] - h[v] ,h[i]代表i点的势,这样的话,将新的图中的s-t路径的长度减去常数h[s] - h[t] ,得到的即为原图中对应路径的长度,因此新图和原图中的最短路是一致的。 因为dijkstra只实用于无负环的图,所以我们需要选取合适的势,将使得新图的每一条边的费用 cost[e] >= 0,我们就可以用dijkstra算法求最小费用流了。 代码区 #pragma GCC optimize(2) //O2优化,不开过不去... #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<queue> #include<string> #include<fstream> #include<vector> #include<stack>

HDU-4280-Island Transport(网络流,最大流, ISAP)

…衆ロ難τιáo~ 提交于 2019-11-26 17:26:25
链接: https://vjudge.net/problem/HDU-4280 题意: In the vast waters far far away, there are many islands. People are living on the islands, and all the transport among the islands relies on the ships.   You have a transportation company there. Some routes are opened for passengers. Each route is a straight line connecting two different islands, and it is bidirectional. Within an hour, a route can transport a certain number of passengers in one direction. For safety, no two routes are cross or overlap and no routes will pass an island except the departing island and the arriving island. Each island

C# Socket编程(5)使用TCP Socket

落花浮王杯 提交于 2019-11-26 17:09:47
   TCP 协议 (Transmission Control Protocol,传输控制协议)是 TCP/IP体系中面向连接(connection oriented)的传输层(transport layer) , TCP协议 能够检测和恢复IP层提供的主机到主机的信道中可能发生的报文丢失、重复以及其他错误。由于TCP协议是一种面向连接协议:在使用它进行通信之前,两个应用程序之间首先要建立一个TCP连接。TCP能够在网络中提供双工和可靠的的服务。 阅读目录:     1.TCP概述    2.在.NET平台TCP应用的工作模式      2.1 了解TcpListener和TcpClient    3.解决TCP的消息无边界问题      3.1 发送固定长度的消息      3.2 将消息长度与消息一起发送      3.3 使用特殊标记分隔消息     4.一个同步TCP Socket示例   5.示例源码下载   6.进一步阅读&参考资料 1.TCP概述   通信双方建立了TCP连接后,双方就可以相互发送数据了。TCP负责把用户数据(字节流)按照一定格式和长度组成多个数据报进行发送,然后在接到数据报之后分解按顺序重新组装和恢复用户数据。 利用TCP传输数据时,数据时以字节的形式进行传输的。客户端和服务端建立连接后,发送数据方需要先将数据转换为字节流,然后将字节流发送到对方

网络流——最小费用最大流模板

混江龙づ霸主 提交于 2019-11-26 17:09:10
#zkw费用流# 参考网址: https://artofproblemsolving.com/community/c1368h1020435 zkw大佬的改进:①在dfs的时候可以实现多路增广②KM算法节省SPFA时间(然而我这里没有KM,要问为什么,当然是因为我不会了orz); but,参考了另外的博客,修修补补又三年~ 1 #include <algorithm> 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 #include <queue> 6 #include <cmath> 7 using namespace std; 8 const int maxv= 200010; 9 const int maxe= 2000010; 10 const int INF= 0x3f3f3f3f; 11 12 struct ENode 13 { 14 int to; 15 int c; 16 int f; 17 int Next; 18 }; 19 ENode edegs[maxe]; 20 int Head[maxv], tnt; 21 void init() 22 { 23 memset(Head, -1, sizeof(Head)); 24 tnt= -1; 25 } 26 void Add

BZOJ 1562: [NOI2009]变换序列 二分图倒序匹配:匈牙利算法

血红的双手。 提交于 2019-11-26 16:49:46
title BZOJ 1562 LUOGU 1963 Description Input Output Sample Input 5 1 1 2 2 1 Sample Output 1 2 4 0 3 HINT 30%的数据中N≤50; 60%的数据中N≤500; 100%的数据中N≤10000。 BZOJ又直接把pdf的图片粘过来了。 analysis 这道题很妙啊!把一道看起来挺数论的题搞成二分图匹配。 抱歉,由于我们两个是在讨论网络流,所以,又在想这道题的网络流算法。 我想出:直接跑最大流,在选方案的时候,每个点都选相对字典序较小的那个点,应该就可以了吧。 \(Chdy\) 指出:万一你选了字典序较小的点,破坏了最大流呢? 我:... 然后, \(Chdy\) 想到了每个原数列最多可以连两条边,连向变换后的两个点,为什么?自己推这个式子: \(D(x,y)=min\left\{∣x−y∣,N−∣x−y∣\right\}\) 。 随后他想到的一些算法,都无法处理在选择字典序较小的点的同时保证最大流仍成立,所以...我们放弃了网络流写法,开心地奔向了匈牙利算法, ̄▽ ̄。 我想到的是,那就直接每确定一个点,跑一遍匹配。 \(Chdy\) :复杂度不够啊,能拿 \(70pts\) 就不错了。 我:...(你说怎么办呀...) \(Chdy\) :我觉得应该一边匹配,一边修正