繼續補坑..
第三天主要是網路流
首先我們先了解一下網路流的最基本的演算法:dinic
這個演算法的主要做法就是這樣的:
在建好的網路流的圖上從源點開始向匯點跑一遍bfs,然後如果一條邊的流量不為0,那麼就往下標號,
每乙個點的level都是上乙個點的level+1
然後在跑一遍dfs,如果發現邊的兩個點的level差值為1(終點比起點的level大),那麼就走這條邊。
那麼我們首先要了解一下如何建邊
網路流的最基本概念就是:可以反悔
就是說假如說我們有更好的方案,那麼我們可以把原來流掉的流量再流回來。
如何做到呢?就是對於每一條邊連一條方向相反,流量為0的邊。
下面舉圖說明:
這是我們網路流的圖,那麼假設我們一開始走的是中間那條邊,那麼就是這樣,我們得到的最大流是3
然後接下來就是我們增廣的過程啦,因為我們走過的邊的反向邊都加上了流量,我們首先先得到乙個殘量網路
然後我們在又一遍bfs後我們找到這樣一條路:
所以我們最大流+3,是不是很神奇,所以答案就是6啦;
這個過程其實就是把剛才的流量反悔,把下面的這個3的流量讓給下面的一條路,自己走上面的一條路。就是。上圖:
所以這樣就是網路流的基本演算法啦。
下面貼下**
bool————————————————我是分割線————————————————bfs()
}return level[t]!=-1;}
int dfs(int u,int v,int
flow)}}
return
used;
}int dinic(int u,int
v)
return
tot;
}
那麼我們接下來看一看最小割。
最小割的定義就是對於乙個網路流的圖,刪掉一些邊,使得從源點沒有路徑可以到達匯點,而花費(刪掉一條邊的花費就是該邊的流量)的總和的最小值就是最小割。
比如下圖中紅色的邊就是最小割
那麼我們會驚奇的發現最小割就是最大流。。(至於理論我就不證明了)
——————————————我是分割線——————————————
而對於網路流這一塊來說,難的不是演算法本身,而是建圖這一環節:
本帖著重講解的是最小割的建圖:
對於求最小割,我們一般都是要求總收益最大的一類題目,題目一般會告訴你有很多種收益,那麼我們如何根據題目建圖呢?
首先我們要在腦海中有乙個概念,就是說我們假如說刪掉一條邊,意味著我們損失了一項收益,假如說我們的題目告訴我們乙個專案有兩種選項a,b,那麼我們假設乙個點割到s(表示這個點所對應的專案與t相連的邊被割斷,之所以這麼說是因為我們有可能把乙個專案拆成多個點來建圖)代表的是他選擇a收益,那麼就說明放棄了b收益,所以b收益就是損失的一部分。
所以對於上述型別的題目,我們從s到專案連一條流量為ai的邊,從專案向匯點連一條流量為bi的邊,然後跑最大流。然後我們把所有的收益加起來-最大流(總損失)就是我們的最大收益啦!
那麼還有一種題目是如果我們同時選擇幾種專案才能獲得一項收益,對於這種圖我們怎麼辦呢?
對於這種圖,我們需要建乙個輔助節點,假設我們知道多個節點都割到s才能獲得這項收益,那麼我們就從這些節點向輔助節點連一條流量為inf的邊(表示這些邊不能被割斷),然後我們再從輔助節點向t連一條流量為收益大小的邊,具體上圖:
圖中的兩個點如果只要有乙個點割到t,那麼輔助節點到t的邊就必須被割斷(損失該項收益)
而這種輔助節點建在哪一邊取決於滿足條件是多個點割到s還是割到t,如果是割到s,那麼輔助節點在t一側,否則在s一側。本型別最經典的題目就是文理分科(bzoj_3894)
下面貼上該題**
#include#include注:本題getchar快讀在c++中無法執行,如要除錯請刪除ifndef~endif這一段,出事本人概不負責qaq#define min(a,b) ((a)
#define inf 0x3f3f3f3f
#define mn 30005
#define m 300005#ifndef debug
#define getchar() (ss==tt&&(tt=(ss=bb)+fread(bb,1,1<<15,stdin),tt==ss)?eof:*ss++)
char bb[1
<<15],*ss=bb,*tt=bb;
#endif
using
namespace
std;
inline
intread()
int n,m,sum,s,t,num=1
;int
head[mn],level[mn],que[mn];
struct
edgeg[m];
bool
bfs()
return level[t]!=-1;}
int dfs(int u,int
flow)
}return
used;
}int
dinic()
void ins(int u,int v,int w)
void insw(int u,int v,int w)
void add(int x,int
u)
else
}int
main()
Day 3 網路基礎
網際網路協議 指的就是一系列統一的標準,這些標準稱之為網際網路協議。網際網路的本質就是一系列的協議,總稱為 網際網路協議 internet protocol suite 網際網路協議的功能 定義計算機如何接入internet,以及接入internet的計算機通訊的標準。總結如下圖 tcp的三次握手和...
bzoj1412 網路流最小割
狼愛上羊啊愛的瘋狂,誰讓他們真愛了一場 狼愛上羊啊並不荒唐,他們說有愛就有方向 orez聽到這首歌,心想 狼和羊如此和諧,為什麼不嘗試羊狼合養呢?說幹就幹!orez的羊狼圈可以看作乙個n m個矩陣格仔,這個矩陣的邊緣已經裝上了籬笆。可是drake很快發現狼再怎麼也是狼,它們總是對羊垂涎三尺,那首歌只...
DAY3網路 通訊基礎原理
網際網路協議 計算機之間通訊的標準 為什麼要有網際網路協議 ios劃分模型如下圖所示 功能 通過線 光纜 電纜 雙絞線 將兩台機器連線起來,基於電器特性傳送0 1高低電平。功能 定義電訊號分組形式 多少電訊號一組,每組都是什麼意思 補充 每組電訊號構成乙個資料報,叫做 幀 每組資料幀 分成 報頭he...