public <T extends Edge> T getEdge(int i) { T e; elementLock.lock(); e = sg.getEdge(wrappedElement.getEdge(i).getIndex()); elementLock.unlock(); return e; }
nodes[i] = node.getEdge(i).getOpposite(node);
public <T extends Edge> T getEdge(int i) { T e; elementLock.lock(); e = sg.getEdge(wrappedElement.getEdge(i).getIndex()); elementLock.unlock(); return e; }
nodes[i] = node.getEdge(i).getOpposite(node);
/** * Choose an edge at random from the edges connected to the given node. * * @param random * The random number generator to use. * @return An edge chosen at random, null if the node has no edges. * @complexity O(1). */ public static Edge randomEdge(Node node, Random random) { int n = node.getDegree(); if (n > 0) { return node.getEdge(random.nextInt(n)); // int r = random.nextInt(n); // int i = 0; // // for (Edge edge : node.getEdgeSet()) { // if (r == i) // return edge; // i++; // } } return null; }
/** * Choose an edge at random from the edges connected to the given node. * * @param random * The random number generator to use. * @return An edge chosen at random, null if the node has no edges. * @complexity O(1). */ public static Edge randomEdge(Node node, Random random) { int n = node.getDegree(); if (n > 0) { return node.getEdge(random.nextInt(n)); // int r = random.nextInt(n); // int i = 0; // // for (Edge edge : node.getEdgeSet()) { // if (r == i) // return edge; // i++; // } } return null; }
protected double findPath(LinkedList<Node> path, Node source, Node target) { path.addLast(source); if (source == target) return Double.MAX_VALUE; double minCf; for (int i = 0; i < source.getDegree(); i++) { Edge e = source.getEdge(i); Node o = e.getOpposite(source); if (getCapacity(source, o) - getFlow(source, o) > 0 && !path.contains(o)) { if ((minCf = findPath(path, o, target)) > 0) return Math.min(minCf, getCapacity(source, o) - getFlow(source, o)); } } path.removeLast(); return 0; } }
protected double findPath(LinkedList<Node> path, Node source, Node target) { path.addLast(source); if (source == target) return Double.MAX_VALUE; double minCf; for (int i = 0; i < source.getDegree(); i++) { Edge e = source.getEdge(i); Node o = e.getOpposite(source); if (getCapacity(source, o) - getFlow(source, o) > 0 && !path.contains(o)) { if ((minCf = findPath(path, o, target)) > 0) return Math.min(minCf, getCapacity(source, o) - getFlow(source, o)); } } path.removeLast(); return 0; } }
edge = node.getEdge(i); f = 1;
edge = node.getEdge(i); f = 1;
tuple[i] = nodeWithMinDegree.getEdge(i);
tuple[i] = nodeWithMinDegree.getEdge(i);
Edge e = u.getEdge(i); Node v = e.getOpposite(u);
Edge e = u.getEdge(i); Node v = e.getOpposite(u);
public void compute() { Node source = flowGraph.getNode(sourceId); Node sink = flowGraph.getNode(sinkId); if (source == null) throw new ElementNotFoundException("node \"%s\"", sourceId); if (sink == null) throw new ElementNotFoundException("node \"%s\"", sinkId); checkArrays(); loadCapacitiesFromAttribute(); for (int i = 0; i < flowGraph.getEdgeCount(); i++) { Edge e = flowGraph.getEdge(i); setFlow(e.getNode0(), e.getNode1(), 0); setFlow(e.getNode1(), e.getNode0(), 0); } double minCf; LinkedList<Node> path = new LinkedList<Node>(); while ((minCf = findPath(path, source, sink)) > 0) { for (int i = 1; i < path.size(); i++) { Node u = path.get(i - 1); Node v = path.get(i); setFlow(u, v, getFlow(u, v) + minCf); setFlow(v, u, getFlow(v, u) - minCf); } path.clear(); } double flow = 0; for (int i = 0; i < source.getDegree(); i++) flow += getFlow(source, source.getEdge(i).getOpposite(source)); maximumFlow = flow; }
public void compute() { Node source = flowGraph.getNode(sourceId); Node sink = flowGraph.getNode(sinkId); if (source == null) throw new ElementNotFoundException("node \"%s\"", sourceId); if (sink == null) throw new ElementNotFoundException("node \"%s\"", sinkId); checkArrays(); loadCapacitiesFromAttribute(); for (int i = 0; i < flowGraph.getEdgeCount(); i++) { Edge e = flowGraph.getEdge(i); setFlow(e.getNode0(), e.getNode1(), 0); setFlow(e.getNode1(), e.getNode0(), 0); } double minCf; LinkedList<Node> path = new LinkedList<Node>(); while ((minCf = findPath(path, source, sink)) > 0) { for (int i = 1; i < path.size(); i++) { Node u = path.get(i - 1); Node v = path.get(i); setFlow(u, v, getFlow(u, v) + minCf); setFlow(v, u, getFlow(v, u) - minCf); } path.clear(); } double flow = 0; for (int i = 0; i < source.getDegree(); i++) flow += getFlow(source, source.getEdge(i).getOpposite(source)); maximumFlow = flow; }