網路流最大流之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中...