bool dfs_all_path(Digraph& dg, ArcFilter& arc_filter, Digraph::Node s, Digraph::Node t, IntArray& pathNums, EdgeArray& allPath) { for(int k=1;k<1000;k++) { //存储搜索的路径 EdgeArray p; //搜索第k路径 //acutPrintf(_T("\nK=%d"),k); if(!mrp_k(dg, arc_filter, s, t, k, p)) { //一旦第k次搜索不成功,后续的搜索同样也会失败! //所以这时候可以直接退出循环了 break; } else { //记录路径的分支个数 pathNums.push_back(p.size()); //将路径复制到allPath数组中 std::copy(p.begin(), p.end(), std::back_inserter(allPath)); } } return (!pathNums.empty()); //return false; }
int Network::Dinic() { int maxflow = 0; int u,v,e,ee,f; IntArray q; _E.resize(_E.size()+1); _E.back().v = _s; while (true) { for (u = 0;u < _V.size();u++) _V[u].l = -1; _V[_s].l = f = 0; _V[_s].o = _V[_s].e; q.clear(); q.push_back(_s); while (f < (int)q.size()) { u = q[f++]; for (e = _V[u].e;e != -1;e = _E[e].n) { v = _E[e].v; if (_V[v].l == -1 && _E[e].c > 0) { _V[v].o = _V[v].e; _V[v].l = _V[u].l+1; q.push_back(v); } } } if (_V[_t].l == -1) break; q.clear(); q.push_back(_E.size()-1); while (!q.empty()) { u = _E[q.back()].v; if (u == _t) { for (f = INT_MAX,e = 1;e < (int)q.size();e++) if (_E[q[e]].c < f) f = _E[q[e]].c,u = e; for (e = 1;e < q.size();e++) { _E[q[e]].c -= f; _E[q[e]^1].c += f; } maxflow += f; q.resize(u); } else { for (e = _V[u].o;e != -1;e = _E[e].n) { if (_V[_E[e].v].l < 0 || _E[e].c < 1) continue; if (_V[_E[e].v].l == _V[u].l+1) break; } if ((_V[u].o = e) != -1) q.push_back(e); else { q.pop_back(); _V[u].l = -1; } } } } return maxflow; }