網路流之SAP演算法學習

2021-09-09 00:11:52 字數 2890 閱讀 7635

終於決定開始學習網路流了=.=

《圖論演算法理論、實踐與應用》那本書講了很多關於求最大流的演算法,然後我就只挑了一種傳說中神奇的sap演算法學習。

首先引入幾個新名詞:

1、距離標號:

所謂距離標號 ,就是某個點到匯點的最少的弧的數量(即邊權值為1時某個點到匯點的最短路徑長度)。

設點i的標號為level[i],那麼如果將滿足level[i]=level[j]+1的弧(i,j)叫做允許弧 ,且增廣時只走允許弧。

2、斷層(本演算法的gap優化思想):

gap[i]陣列表示距離標號為i的點有多少個,如果到某一點沒有符合距離標號的允許弧,那麼需要修改距離標號來找到增廣路;

如果重標號使得gap陣列中原標號數目變為0,則演算法結束。

sap演算法框架:

1、初始化;

2、不斷沿著可行弧找增廣路。可行弧的定義為;

3、當前節點遍歷完以後,為了保證下次再來的時候有路可走,重新標號當前距離,level[i]=min(level[j]+1);

該演算法最重要的就是gap常數優化了。

下面對hdu 1532貼上模版:

鄰接矩陣:

1 #include2 #include3 #include4

using

namespace

std;

5#define maxn 222

6#define inf 100000000+1000

7int map[maxn][maxn];//存圖8

int pre[maxn];//

記錄當前點的前驅

9int level[maxn];//

記錄距離標號

10int gap[maxn];//

gap常數優化

11int

nv,ne;

1213

//入口引數vs源點,vt匯點

14int sap(int vs,int

vt)26}27

if(v<=vt)

36 maxflow+=aug;

37//

更新殘留網路

38for(int i=v;i!=vs;i=pre[i])

42 u=vs;//

從源點開始繼續搜43}

44 }else52}

53 gap[level[u]]--;//

(更新gap陣列)當前標號的數目減1;

54if(gap[level[u]]==0)break;//

出現斷層

55 level[u]=minlevel+1

;56 gap[level[u]]++;

57 u=pre[u];58}

59}60return

maxflow;61}

6263

intmain()

71 printf("

%d\n

",sap(1

,n));72}

73return0;

74}7576

7778

7980

8182

鄰接表:

1 #include2 #include3 #include4 #include5

using

namespace

std;

6#define maxn 444 //

鄰接表要開邊數的2倍78

struct

edgeedge[maxn];

11int level[maxn];//

標記層次(距離標號)

1213

//間隙優化,定義gap[i]為標號是i的點的個數

14//

在重標記i時,檢查gap[level[i]],若減為0,這演算法結束。

15int

gap[maxn];

1617

int pre[maxn];//

前驅18

intcur[maxn];

19int

head[maxn];

20int

nv,ne;

2122

//ne為邊數,初始化為0;

23void insert(int u,int v,int cap,int cc=0)30

3132

//引數,源點,匯點

33int sap(int vs,int

vt)61 aug=-1;62

}63goto

loop;64}

65}66int minlevel=nv;

67//

尋找與當前點相連線的點中最小的距離標號(重標號)

68for(int i=head[u];i!=-1;i=edge[i].next)74}

75if((--gap[level[u]])==0)break;//

更新gap陣列後如果出現斷層,則直接退出。

76 level[u]=minlevel+1;//

重標號77 gap[level[u]]++;//

距離標號為level[u]的點的個數+1;

78 u=pre[u];//

轉當前點的前驅節點繼續尋找可行弧79}

80return

maxflow;

81}

8283

intmain()

93 printf("

%d\n

",sap(1

,nv));94}

95return0;

96 }

網路流之SAP演算法學習

終於決定開始學習網路流了 圖論演算法理論 實踐與應用 那本書講了很多關於求最大流的演算法,然後我就只挑了一種傳說中神奇的sap演算法學習。首先引入幾個新名詞 1 距離標號 所謂距離標號 就是某個點到匯點的最少的弧的數量 即邊權值為1時某個點到匯點的最短路徑長度 設點i的標號為level i 那麼如果...

網路流初步 sap演算法

什麼是網路流?請看下圖 這是乙個有向圖,每一條邊都對應著兩個數值 前面的稱為流量,用f u,v 表示,後面的稱為容量,用c u,v 表示,網路中有兩個特殊的點,源點s和匯點t。一 容量限制,對於所有原圖中的變,均有f u,v c u v 二 反對稱性,為了方便計算,我們定f u,v 和f v u 中...

網路流最大流之SAP演算法 詳解

網路流最大流之sap演算法 首先引入幾個新名詞 1 距離標號 所謂距離標號 就是某個點到匯點的最少的弧的數量 即邊權值為1時某個點到匯點的最短路徑長度 設點i的標號為level i 那麼如果將滿足level i level j 1的弧 i,j 叫做允許弧 且增廣時只走允許弧。2 斷層 本演算法的ga...