private Edge FindNextEdge(Node currentNode) { var bestNodeName = UnusedEdges.FindAll(e => e.StartNode == currentNode || e.EndNode == currentNode) .Min(e => (e.StartNode == currentNode) ? e.EndNode.Name : e.StartNode.Name); Edge bestEdge = UnusedEdges.FirstOrDefault(e => (e.StartNode == currentNode && e.EndNode.Name == bestNodeName) || (e.EndNode == currentNode && e.StartNode.Name == bestNodeName)); bestEdge = FixEdgeDirection(bestEdge, currentNode); return(bestEdge); }
private List <Edge> FindCycle(Node startingNode) { List <Edge> cycle = new List <Edge>(); Edge nextEdge; Node lastNode = startingNode; do { nextEdge = FindNextEdge(lastNode); cycle.Add(nextEdge); UnusedEdges.RemoveAll(ue => ue.Number == nextEdge.Number); UsedEdges.Add(nextEdge); lastNode = lastNode == nextEdge.StartNode ? nextEdge.EndNode : nextEdge.StartNode; } while (lastNode != startingNode); return(cycle); }