儲存鄰接表是使用的是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...