培訓補坑(day3 網路流 最小割)

2022-05-16 03:36:12 字數 3103 閱讀 3501

繼續補坑..

第三天主要是網路流

首先我們先了解一下網路流的最基本的演算法: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

#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()

注:本題getchar快讀在c++中無法執行,如要除錯請刪除ifndef~endif這一段,出事本人概不負責qaq

Day 3 網路基礎

網際網路協議 指的就是一系列統一的標準,這些標準稱之為網際網路協議。網際網路的本質就是一系列的協議,總稱為 網際網路協議 internet protocol suite 網際網路協議的功能 定義計算機如何接入internet,以及接入internet的計算機通訊的標準。總結如下圖 tcp的三次握手和...

bzoj1412 網路流最小割

狼愛上羊啊愛的瘋狂,誰讓他們真愛了一場 狼愛上羊啊並不荒唐,他們說有愛就有方向 orez聽到這首歌,心想 狼和羊如此和諧,為什麼不嘗試羊狼合養呢?說幹就幹!orez的羊狼圈可以看作乙個n m個矩陣格仔,這個矩陣的邊緣已經裝上了籬笆。可是drake很快發現狼再怎麼也是狼,它們總是對羊垂涎三尺,那首歌只...

DAY3網路 通訊基礎原理

網際網路協議 計算機之間通訊的標準 為什麼要有網際網路協議 ios劃分模型如下圖所示 功能 通過線 光纜 電纜 雙絞線 將兩台機器連線起來,基於電器特性傳送0 1高低電平。功能 定義電訊號分組形式 多少電訊號一組,每組都是什麼意思 補充 每組電訊號構成乙個資料報,叫做 幀 每組資料幀 分成 報頭he...