dinic演算法的改進

2021-07-25 02:31:51 字數 1297 閱讀 9034

儲存鄰接表是使用的是head陣列,現在另設乙個head2陣列,儲存的是每個節點x從head2[x]開始的邊才會有增廣路,這樣減少了無用邊的迴圈。並且head2陣列只在全域性初始化一次,即如果沒有增廣,該值只會逐漸減小直到0。

在hdu3572中使用該優化可使時間從998ms優化值156ms

附上**

/*注釋的地方是與平常dinic不同的地方,注意即可

*/#include

#include

#include

#include

using

namespace

std;

struct edge

;edge v[1000*1000+50];

int tot;

int head[1050];

int head2[1050];//***

int d[1050];

int st,ed;

int n,m;

int p[550];

int s[550];

int e[550];

int sump;

void add(int x,int y,int l)

bool bfs()

queue

q;q.push(st);

d[st]=1;

int now=0;

head2[st]=head[st];//***

while (!q.empty())}}

return d[ed];

}int dinic(int x,int flow)

}head2[x]=i;//***

if (temp==flow) return flow;

}return temp;

}int t;

int main()

tot=1;

memset(head,0,sizeof(head));

memset(head2,0,sizeof(head2));

st=n+r-l+2;

ed=n+r-l+3;

for (int i=1;i<=n;i++)

}for (int i=l;i<=r;i++)

int maxflow=0;

int now=0;

while (bfs())

printf("case %d: ",tt);

if (maxflow==sump)

else

printf("\n");

}return

0;}

dinic演算法實現

今天 實現時,發現我昨天的理解有乙個誤區 分層圖是要不斷建立的,而不是建一次就夠了。下面貼出我的 不得不說,用鏈式前向星存圖真是方便 include include includeusing namespace std int m,n,ne 0 struct node edge 233 int he...

dinic演算法模板

用於計算最大流,帶有當前弧優化 下面是對演算法的簡明概述 首先dinic演算法屬於增廣路演算法,通過不斷尋找從源點到匯點的增廣路來實現擴流,但想較之ford fulkerson演算法來說,dinic在尋找增廣路之前,將原圖進行分層處理,即 以源點為深度為零的點,不斷向下按照深度將原圖的點標記 並且永...

Dinic演算法模板

沒什麼好說的,建議直接背過。dinic的複雜度就是個笑話,跟放p一樣 看似 o n 2m 實則艹過 n 10 5,m 10 6 include using namespace std typedef long long ll const int n 1e4 10,m 2e5 10,inf 1e8 i...