示例#1
0
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);
}