public static bool HasPath(Graphs.Node <T> source, Graphs.Node <T> destination) { var nextToVisit = new Queue <Graphs.Node <T> >(); nextToVisit.Push(source); while (nextToVisit.Size > 0) { var node = nextToVisit.Pop(); if (node == destination) { return(true); } if (node.IsVisited) { continue; } node.IsVisited = true; var current = node.Adjacent.Head; while (current != null) { var edge = current.Value; nextToVisit.Push(edge.Destination); current = current.Next; } } return(false); }
private void Form1_Load(object sender, EventArgs e) { nodeA = new Graphs.Node("A"); nodeB = new Graphs.Node("B"); nodeC = new Graphs.Node("C"); nodeD = new Graphs.Node("D"); nodeE = new Graphs.Node("E"); nodeF = new Graphs.Node("F"); nodeG = new Graphs.Node("G"); nodeH = new Graphs.Node("H"); nodeI = new Graphs.Node("I"); nodeX = new Graphs.Node("X"); nodeA.Neighbours.Add(nodeB); nodeA.Neighbours.Add(nodeC); nodeB.Neighbours.Add(nodeA); nodeB.Neighbours.Add(nodeD); nodeB.Neighbours.Add(nodeE); nodeC.Neighbours.Add(nodeA); nodeC.Neighbours.Add(nodeF); nodeC.Neighbours.Add(nodeG); nodeD.Neighbours.Add(nodeB); nodeD.Neighbours.Add(nodeE); nodeE.Neighbours.Add(nodeB); nodeE.Neighbours.Add(nodeD); nodeF.Neighbours.Add(nodeC); nodeF.Neighbours.Add(nodeG); nodeG.Neighbours.Add(nodeC); nodeG.Neighbours.Add(nodeF); nodeG.Neighbours.Add(nodeH); nodeG.Neighbours.Add(nodeI); nodeH.Neighbours.Add(nodeG); nodeH.Neighbours.Add(nodeI); nodeI.Neighbours.Add(nodeG); nodeI.Neighbours.Add(nodeH); nodeI.Neighbours.Add(nodeX); nodeX.Neighbours.Add(nodeI); }
public static void Run(Graphs.Node <T> start) { start.DistanceFromSource = 0; start.IsVisited = true; var queue = new Queue <Edge <T> >(); var current = start.Adjacent.Head; while (current != null) { var edge = current.Value; queue.Push(edge); current = current.Next; } while (queue.Size > 0) { var currentEdge = queue.Pop(); var currentNode = currentEdge.Source; var destinationNode = currentEdge.Destination; var adjNode = destinationNode.Adjacent.Head; while (adjNode != null) { var edge = adjNode.Value; if (!edge.Destination.IsVisited) { queue.Push(edge); } adjNode = adjNode.Next; } if (currentNode.DistanceFromSource + currentEdge.Weight < destinationNode.DistanceFromSource) { destinationNode.DistanceFromSource = currentNode.DistanceFromSource + currentEdge.Weight; destinationNode.PreviousNode = currentNode; } currentNode.IsVisited = true; } }
private void depthBtn_Click(object sender, EventArgs e) { ArrayList allVisitedNodes = new ArrayList(); Stack <Graphs.Node> nodeStack = new Stack <Graphs.Node>(); bool end = false; Graphs.Node currentNode = nodeA; allVisitedNodes.Add(currentNode); while (!end) { Graphs.Node nextNode = currentNode.GetNextUnvisited((Graphs.Node[])allVisitedNodes.ToArray(typeof(Graphs.Node))); if (nextNode != null) { nodeStack.Push(currentNode); currentNode = nextNode; allVisitedNodes.Add(currentNode); } else { if (currentNode == nodeA) { end = true; } else { currentNode = nodeStack.Pop(); } } } foreach (Graphs.Node node in allVisitedNodes) { nodeBox.Text += node.Name; } }
private void breadthBtn_Click(object sender, EventArgs e) { ArrayList allVisitedNodes = new ArrayList(); Queue <Graphs.Node> nodeQueue = new Queue <Graphs.Node>(); bool end = false; Graphs.Node currentNode = nodeA; allVisitedNodes.Add(currentNode); while (!end) { ArrayList unvisitedNodes = new ArrayList(); unvisitedNodes.AddRange(currentNode.GetUnvisitedNeighbours((Graphs.Node[])allVisitedNodes.ToArray(typeof(Graphs.Node)))); foreach (Graphs.Node node in unvisitedNodes) { nodeQueue.Enqueue(node); } if (nodeQueue.Count > 0) { allVisitedNodes.Add(currentNode); currentNode = nodeQueue.Dequeue(); } else { end = true; } } foreach (Graphs.Node node in allVisitedNodes) { nodeBox.Text += node.Name; } }