public override HashSet <CGraphNode> Visit(CGraphNode node) { CCharRangeSet set; CIt_Successors it = new CIt_Successors(node); for (it.Begin(); !it.End(); it.Next()) { CGraphEdge edge = m_graph.Edge(node, it.M_CurrentItem); set = m_graph.GetFAEdgeInfo(edge); if (set != null && set.IsCharInSet(m_character)) { m_outputSet.Add(it.M_CurrentItem); } } return(m_outputSet); }
/// <summary> /// The Visit method refers to the action the algorithm performs to a specific edge /// Most of the times the Visit function is called recursively. /// </summary> /// <param name="edge"></param> /// <returns> /// The parameter refers to the type of the return result /// </returns> public override CGraphEdge Visit(CGraphEdge edge) { CIt_Successors itn = new CIt_Successors(edge.M_Target); CGraphEdge visitedEdge; // Mark the edge as visited SetColor(edge, 1); for (itn.Begin(); !itn.End(); itn.Next()) { //visitedEdge = Edge(edge.M_Target, itn.M_CurrentItem); //if (Color(visitedEdge) == 0) { // Visit(visitedEdge); //} } return(edge); }
public override CGraphNode Visit(CGraphNode node) { CIt_Successors it = new CIt_Successors(node); // Paint the node gray (1) at first visit SetColor(node, 1); // EVENT : Raising on OnNodeEnter OnProcessBefore(new ProcessBeforeEventArgs() { M_Node = node }); // Visit adjacent nodes for (it.Begin(); !it.End(); it.Next()) { if (Color(it.M_CurrentItem) == 0) { // VISIT WHITE NODES OnProcessSuccBefore(new ProcessSuccBeforeEventArgs() { M_Node = node, M_Successor = it.M_CurrentItem }); Visit(it.M_CurrentItem); OnProcessSuccAfter(new ProcessSuccAfterEventArgs() { M_Node = node, M_Successor = it.M_CurrentItem }); } else { // EVENT : Raise the OnBypassingNode event OnBypassNode(EventArgs.Empty); } } // Paint the node black (2) when all adjacent nodes are visited SetColor(node, 2); // EVENT : Raising on OnNodeExit OnProcessAfter(new ProcessAfterEventArgs() { M_Node = node }); return(node); }
public override CGraphNode Visit(CGraphNode node) { CGraphEdge newSTedge; // Paint the node gray (1) at first visit SetColor(node, 1); SetPreOrderNumber(m_Mappping.DerivedNode(node), ++m_preorderCounter); CIt_Successors it = new CIt_Successors(node); for (it.Begin(); !it.End(); it.Next()) { if (Color(it.M_CurrentItem) == 0) { Visit(it.M_CurrentItem); newSTedge = m_dfsSpanningTree.AddGraphEdge(m_Mappping.DerivedNode(node), m_Mappping.DerivedNode(it.M_CurrentItem), EdgeTypeDFS.tree); m_Mappping.SetOriginalToDerivedEdge(m_sourceGraphs[0].Edge(node, it.M_CurrentItem), newSTedge); } else if (PreOrderNumber(m_Mappping.DerivedNode(node)) < PreOrderNumber(m_Mappping.DerivedNode(it.M_CurrentItem))) { // The successor has already been visited from another path prior to the current node newSTedge = m_dfsSpanningTree.AddGraphEdge(m_Mappping.DerivedNode(node), m_Mappping.DerivedNode(it.M_CurrentItem), EdgeTypeDFS.forward); m_Mappping.SetOriginalToDerivedEdge(m_sourceGraphs[0].Edge(node, it.M_CurrentItem), newSTedge); } else if (PostOrderNumber(m_Mappping.DerivedNode(it.M_CurrentItem)) == 0) { // The successor (which is an actual predecessor) has already been visited and not assigned a postorder number // which means that both nodes have been visited from the same path. Hence it is a backedge and not a cross edge... newSTedge = m_dfsSpanningTree.AddGraphEdge(m_Mappping.DerivedNode(node), m_Mappping.DerivedNode(it.M_CurrentItem), EdgeTypeDFS.back); m_Mappping.SetOriginalToDerivedEdge(m_sourceGraphs[0].Edge(node, it.M_CurrentItem), newSTedge); } else { //...otherwise it is a cross edge newSTedge = m_dfsSpanningTree.AddGraphEdge(m_Mappping.DerivedNode(node), m_Mappping.DerivedNode(it.M_CurrentItem), EdgeTypeDFS.cross); m_Mappping.SetOriginalToDerivedEdge(m_sourceGraphs[0].Edge(node, it.M_CurrentItem), newSTedge); } } SetPostOrderNumber(m_Mappping.DerivedNode(node), ++m_postorderCounter); return(node); }
public override int Visit(CGraphNode node) { m_time++; SetArrival(node, m_time); SetColor(node, NodeColor.NC_GRAY); CIt_Successors si = new CIt_Successors(node); for (si.Begin(); !si.End(); si.Next()) { if (Color(si.M_CurrentItem) == NodeColor.NC_WHITE) { Visit(si.M_CurrentItem); } } SetColor(node, NodeColor.NC_BLACK); m_time++; SetDeparture(node, m_time); return(0); }
public override HashSet <CGraphNode> Visit(CGraphNode node) { m_outputSet.Add(node); //1.For each successor scan the nodes that have outgoing e transitions CIt_Successors it = new CIt_Successors(node); for (it.Begin(); !it.End(); it.Next()) { //Find the edge between node and its successor CGraphEdge edge = m_graph.Edge(node, it.M_CurrentItem); //if the edge label is e then visit the successor and append the output set including this successor if (TransitionLabel(edge) == null) { Visit(it.M_CurrentItem); } } // return(m_outputSet); }