1、基於ford-fulkerson方法的edmonds-karp演算法
用廣度有限搜尋來實現對增廣路徑p 的計算。即,如果增廣路徑是殘留網路種從s 到t 的最短路徑,則能夠改進ford-fulkerson的界。
view code
12、dinic演算法//做一次增廣路徑的流量統計23
int augment() else
30 }
31 }
32 }
33if(!flag) return
0;34 v = n; ans = inf;
35while(pre[v] != -1)
39 v = n;
40while(pre[v] != -1)
45return ans;
46 }
詳細講解:'s_algorithm
其實就是對原來的流網路用bfs進行分層,找到一條增廣路徑後退到節點pos,節點pos滿足 f(pos, pos->next) = c(pos, pos->next);然後再進行bfs找經過pos的其他增廣路徑。
view code
1dinic演算法鄰接表實現,很強大的模板。int g[n][n];
2int layer[n];
3bool vis[n];45
int s, t;67
bool layer()
21else q.push_back(i);
22 }
23 }
24 }
25return
false;
26 }
2728
int dinic()
47 }
48 sum += min;
49for(i = 1; i < q.size(); i++)
55 }
56while(!q.empty() && q.back() != pos)
60 } else
67 }
68if(i > t) q.pop_back();
69 }
70 }
71 }
72return sum;
73 }
view code
#include #include#include
#include
#define rep(i, n) for(i = 0; i < n; ++i)
#define for(i, l, h) for(i = l; i <= h; ++i)
#define ford(i, h, l) for(i = h; i >= l; --i)
#define cl(arr, val) memset(arr, val, sizeof(arr))
using
namespace
std;
const
int n = 3000
;const
double inf = ~0u
;struct
node g[n*n];
inthead[n], t;
intlayer[n];
int q[n*1000
];int
s, t;
void
init()
void add(int u, int v, double
c) bool layer() }}
return
false;}
double find()
}for(i,
1, top - 1
) sum +=flow;
top =pos;
} else
if(i != -1) q[top++] =i;
else}}
return
sum;
}double
dinic()
intmain()
for(i,
1, m)
while(l--)
printf(
"%.4lf\n
", exp(dinic()));
}return0;
}
網路流演算法模板
引用於一些大佬的文章 dinic演算法 第二個模板為白書的寫法 poj1273為例 題意 m條路徑,n個點,每條路徑輸入起點,終點和流量,求源點到匯點的最大流量 include include include include define inf 9999999 using namespace st...
網路流基礎演算法模板
網路流是一種非常玄妙的演算法,被廣泛地用於各種有權值存在或一對多的匹配問題中。而網路流又有許多數學性質,比如最大流等於最小割等等。本篇主要介紹常用的dinic最大流演算法。網路,就是一張有點有邊圖。其中有兩個特殊的點 源點和匯點。網路流中的每一條邊就好比一條水管,容量就好比是這個水管的粗細。我們要求...
網路流EdmondsKarp演算法模板理解
先推薦乙個講網路流的部落格,我的網路流知識均吸收於此 傳送門 edmondskarp演算法基本思想 從起點到終點進行bfs,只要存在路,說明存在增廣路徑,則取這部分路 權值最小的一部分,即為增廣路徑 也就是這一部分路的最大流量 然後將這條路上的正向權值都減去min,反向權值都加上min 即,m i ...