int main(int argc, char *argv[]) { struct argp argp = {options, _parse_opt, "INPUT", doc}; args_t args; graph_t g; memset(&args, 0, sizeof(args)); startup("dumpngdb", argc, argv, &argp, &args); if (ngdb_read(args.input, &g)) { printf("error reading ngdb file %s\n", args.input); goto fail; } if (args.meta) _meta( &g); if (args.labels) _labels(&g); if (args.graph) _graph( &g, args.weights, args.dists); graph_free(&g); return 0; fail: return 1; }
void DinicFlowSolver::solve(int source, int sink) { long long maxCapacity = 0LL; for (int i = 0; i < (int)graph.e.size(); ++i) { for (int j = 0; j < (int)graph.e[i].size(); ++j) { maxCapacity = std::max(maxCapacity, graph.e[i][j]->getCapacity()); } } for (long long minCapacity = maxCapacity; minCapacity > 0; minCapacity /= 2LL) { Net<long long> _graph(graph); std::vector<std::vector<FlowEdge<long long> *> > realEdges(graph.e.size()); for (int i = 0; i < (int)_graph.e.size(); ++i) { _graph.e[i].clear(); } _graph.flow = 0LL; for (int i = 0; i < (int)graph.e.size(); ++i) { for (int j = 0; j < (int)graph.e[i].size(); ++j) { if (graph.e[i][j]->getID() != -1 // direct edge && (graph.e[i][j]->getCapacity() - graph.e[i][j]->getFlow()) >= minCapacity) { FlowEdge<long long> *directEdge = new FlowEdge<long long> (graph.e[i][j]->getID(), graph.e[i][j]->getStartVertex(), graph.e[i][j]->getFinishVertex(), (graph.e[i][j]->getCapacity() - graph.e[i][j]->getFlow()) / minCapacity); FlowEdge<long long> *reversedEdge = new FlowEdge<long long>(directEdge); directEdge->setReversedEdge(reversedEdge); _graph.e[directEdge->getStartVertex()].push_back(directEdge); _graph.e[reversedEdge->getStartVertex()].push_back(reversedEdge); realEdges[directEdge->getStartVertex()].push_back(graph.e[i][j]); realEdges[reversedEdge->getStartVertex()].push_back(NULL); } } } runDinic(_graph, source, sink); for (int i = 0; i < (int)_graph.e.size(); ++i) { for (int j = 0; j < (int)_graph.e[i].size(); ++j) { if (_graph.e[i][j]->getID() != -1) { // direct edge realEdges[i][j]->incFlow(_graph.e[i][j]->getFlow() * minCapacity); } } } graph.flow += _graph.flow * minCapacity; } runDinic(graph, source, sink); }