網洛流

peng1984729發表於2024-04-03

網洛流

可解決圖論中多重貢獻不完全貢獻的問題。

Dinic

注意事項:

1.建反邊

bk[u].push_back(V[v].size());
bk[v].push_back(V[u].size());

2.dis,now陣列清空

memset(dis, 0, sizeof(dis));
memset(now, 0, sizeof(now));

3.dis[S]賦值為1不為0

if(!dis[v] && flw[u][i])

如果賦值為0這會出大問題

4.1次bfs應跑完dinic

while(bfs()){
	while(f = dinic(S, INF)) 
		res += f;
}

最佳化:

if(u == T || !flow){return flow;}

2.當前弧最佳化與判斷res

for(int i = now[u], v; i < V[u].size() && res; i++)
if(!k) dis[v] = 0;

關於輸出最大流方案:

圖中bfs+dinic後的所有dis大於0的點。

對於淨值的計算,即最大割,對於每個點計算min(入度權值和,出度權值和)。