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

2021-07-11 13:28:35 字數 3063 閱讀 3857

網路流最大流之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貼上模版:

(hdu1532 problem鏈結)

鄰接矩陣:

1 #include

2 #include

3 #include

4using

namespace std;

5#define maxn 222

6#define inf 100000000+1000

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

8int pre[maxn];//

記錄當前點的前驅 9

int level[maxn];//

記錄距離標號 10

int gap[maxn];//gap

常數優化 11

int nv,ne;12

13//

入口引數vs源點,vt匯點

14int sap(int vs,int vt)

26         }

27if(v<=vt)

36                 maxflow+=aug;

37//

更新殘留網路 38

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

42                 u=vs;//

從源點開始繼續搜

43            }

44        }else

52            }

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 }62

63int main()

71        printf("%d\n",sap(1,n));

72     }

73return

0;74 }              

鄰接表:

1 #include

2 #include

3 #include

4 #include

5using

namespace std;

6#define maxn 444 //

鄰接表要開邊數的2倍7

8struct edgeedge[maxn];

11int level[maxn];//

標記層次(距離標號) 12

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

14//

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

15int gap[maxn];16

17int pre[maxn];//前驅

18int cur[maxn];

19int head[maxn];

20int nv,ne;21

22//ne

為邊數,初始化為0;

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

31 32//

引數,源點,匯點 33

int sap(int vs,int vt)

61                     aug=-1;

62                 }

63goto loop;

64            }

65        }

66int minlevel=nv;

67//

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

for(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 } 82

83int main()

93        printf("%d\n",sap(1,nv));

94     }

95return

0;96 }

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

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

網路流最大流的sap 演算法

現在想將一些物資從s運抵t,必須經過一些中轉站。連線中轉站的是公路,每條公路都有最大運載量。每條弧代表一條公路,弧上的數表示該公路的最大運載量。最多能將多少貨物從s運抵t?這是乙個典型的網路流模型。為了解答此題,我們先了解網編流的有關定義和概論。若有向圖g v,e 滿足下列條件 1.有且僅有乙個頂點...

最大流之sap演算法

若有向圖g v e 滿足下列條件 1 有且僅有乙個頂點s,它的入度為 0 這個頂點稱為源點。2 有且僅有乙個頂點t,它的出度為 0 這個頂點稱為匯點。3 每一條弧都有乙個非負數,叫做這條邊的容量,邊 vi vj 的容量用 cij 來表示。則此有向圖稱為網路流圖,記為 g v e c 對於網路流圖g中...