// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.JunctionChecker.junctionchecking;
import java.util.ArrayList;
import org.openstreetmap.josm.plugins.JunctionChecker.connectedness.BacktrackingColors;
import org.openstreetmap.josm.plugins.JunctionChecker.datastructure.Channel;
import org.openstreetmap.josm.plugins.JunctionChecker.datastructure.ChannelDiGraph;
import org.openstreetmap.josm.plugins.JunctionChecker.datastructure.LeadsTo;
/**
* @author Jörg Possin
*/
public class TRDFS {
private final ArrayList<LeadsTo> cycleEdges;
private final ChannelDiGraph digraph;
public TRDFS(ArrayList<Channel> adnodes, ChannelDiGraph digraph) {
this.digraph = digraph;
this.cycleEdges = new ArrayList<>();
}
public void trdfs(Channel startNode) {
Channel succNode;
startNode.setVisited(BacktrackingColors.GREY);
startNode.addReachableNode(startNode);
startNode.appendChannelToPath(startNode, startNode);
for (int i = 0; i < startNode.getLeadsTo().size(); i++) {
succNode = startNode.getLeadsTo().get(i).getToChannel();
if (succNode.isSubgraph()) {
if (succNode.getVisited() == BacktrackingColors.WHITE) {
digraph.setForwardEdge(startNode, succNode);
trdfs(succNode);
} else if (succNode.getVisited() == BacktrackingColors.GREY) {
cycleEdges.add(digraph.getLeadsTo(startNode,
succNode));
}
for (int j = 0; j < succNode.getReachableNodes().size(); j++) {
startNode.addReachableNode(succNode.getReachableNodeAt(j));
succNode.appendChannelToPath(succNode.getReachableNodeAt(j), succNode.getReachableNodeAt(j));
succNode.appendChannelToPath(succNode.getReachableNodeAt(j), succNode);
startNode.appendPath(succNode.getReachableNodeAt(j), succNode.getPathsAt(succNode.getReachableNodeAt(j)));
}
}
}
startNode.setVisited(BacktrackingColors.BLACK);
}
public void ereaseCycleEdges() {
cycleEdges.clear();
}
public int getCycleedgesSize() {
return cycleEdges.size();
}
public LeadsTo getCycleEdgeAt(int i) {
return cycleEdges.get(i);
}
public ArrayList<LeadsTo> getCycleEdges() {
return cycleEdges;
}
}