/// <summary> /// Bredden först algoritm (BFS) /// </summary> public static string RunAlgorithm(Node startNode, Node endNode) { Queue<Node> nodeQueue = new Queue<Node>(); startNode.DistanceFromStart = 0; nodeQueue.Enqueue(startNode); while (nodeQueue.Any()) { var currentNode = nodeQueue.Dequeue(); if (currentNode.Id == endNode.Id) { var pathStack = new Stack<Node>(); Node temporaryNode = currentNode; while (temporaryNode.PreviousNode != null) { pathStack.Push(temporaryNode); temporaryNode = temporaryNode.PreviousNode; } pathStack.Push(startNode); string pathString = string.Empty; while (pathStack.Any()) { var node = pathStack.Pop(); pathString += node.Id; if (node.Id != endNode.Id) { pathString += ", "; } } return pathString; } else { foreach (var nodeNeighbour in currentNode.Neighbours) { if (!nodeNeighbour.IsVisited) { nodeNeighbour.DistanceFromStart = currentNode.DistanceFromStart + 1; nodeNeighbour.PreviousNode = currentNode; nodeQueue.Enqueue(nodeNeighbour); } } } } return string.Empty; }
/// <summary> /// Skapar en graf som en lista av instanser av Node från de två första input-data-strängarna. /// </summary> /// <param name="numberOfNodes">Antalet noder i grafen</param> /// <param name="edges">en komma separerad lista av kanter i form av strängar med siffror, svarand mot nodnummer, /// som är separerade av mellanslag.</param> /// <returns>grafen som en Node[]</returns> private static Node[] CreateGraph(string numberOfNodes, string edges) { //Skapa arrayen av noder. var graph = new Node[int.Parse(numberOfNodes)]; for (int i = 0; i < graph.Length; i++) { graph[i] = new Node(i); } string[] pairs = edges.Split(new[] {", "}, StringSplitOptions.RemoveEmptyEntries); foreach (string pair in pairs) { string[] nodeNumbers = pair.Split(' '); //Lägg till den ena av de två som bildar en kant som granne till den andre och tvärtom. graph[int.Parse(nodeNumbers[0])].Neighbours.Add(graph[int.Parse(nodeNumbers[1])]); graph[int.Parse(nodeNumbers[1])].Neighbours.Add(graph[int.Parse(nodeNumbers[0])]); } return graph; }