public void computeBFS(GraphAdjList adjLst, int V, int startVertex, Dictionary <int, string> map) { colors = new int[V]; parents = new int[V]; initializeArrays(V); Queue <int> q = new Queue <int>(); q.Enqueue(startVertex); while (q.Count != 0) { int element = q.Dequeue(); colors[element] = 1; if (adjLst.getAdj(element).Count != 0) { foreach (var vertex in adjLst.getAdj(element)) { if (colors[vertex.Item1] == -1) { colors[vertex.Item1] = 1; q.Enqueue(vertex.Item1); } } } Console.Write(map[element] + "\t"); } }
public void computeMST(GraphAdjList adjList, int start) { initialize(adjList); Q.updatePriority(new HeapClass() { data = start, priority = 0 }); while (Q.count() != 0) { HeapClass priorityElement = Q.getMax(); foreach (var v in adjList.getAdj(priorityElement.data)) { if (Q.contains(v.Item1) && -1 * v.Item2 > Q.getPriority(v.Item1)) { Q.updatePriority(new HeapClass() { data = v.Item1, priority = -1 * v.Item2 }); parents[v.Item1] = priorityElement.data; } } } Console.WriteLine("\nvertex\tparent"); for (int i = 0; i < V; i++) { Console.WriteLine("\n" + i + "\t\t" + parents[i]); } }
public void computeMST(GraphAdjList adjList, int vertices) { V = vertices; initializeArrays(); List <Tuple <int, int, int> > edges = new List <Tuple <int, int, int> >(); for (int i = 0; i < vertices; i++) { foreach (var v in adjList.getAdj(i)) { if (!(edges.Contains(new Tuple <int, int, int>(i, v.Item1, v.Item2)) || edges.Contains(new Tuple <int, int, int>(v.Item1, i, v.Item2)))) { edges.Add(new Tuple <int, int, int>(i, v.Item1, v.Item2)); } } } List <Tuple <int, int, int> > sortedEdges = new List <Tuple <int, int, int> >(edges.OrderBy(k => k.Item3)); foreach (var edge in sortedEdges) { if (!findCycle(edge)) { finalEdges.Add(edge); } } foreach (var v in finalEdges.OrderBy(k => k.Item1.ToString() + k.Item2.ToString())) { Console.WriteLine(v.Item1 + "\t" + v.Item2 + "\t" + v.Item3 + "\n"); } }
public void computeShortestPaths(GraphAdjList adjList, int source) { initializeSingleSource(source); extractEdges(adjList); for (int i = 1; i < V; i++) { foreach (var edge in edges) { relax(edge.Item1, edge.Item2, edge.Item3); } } foreach (var edge in edges) { if (distances[edge.Item1] + edge.Item3 < distances[edge.Item2]) { Console.WriteLine("has cycle, cant compute. breaking."); break; } } //print distances Console.WriteLine("\nvertex\tparent\tdistance"); for (int i = 0; i < V; i++) { Console.WriteLine(i + "\t" + parents[i] + "\t" + distances[i]); } }
void DFSUtil(GraphAdjList adjList, Dictionary <int, string> map, int vertex, bool isStronglyConnectedModule) { time += 1; discover[vertex] = time; color[vertex] = 1; if (isStronglyConnectedModule) { Console.Write(vertex.ToString()); } foreach (var v in adjList.getAdj(vertex)) { if (color[v.Item1] == -1) { parent[v.Item1] = vertex; DFSUtil(adjList, map, v.Item1, isStronglyConnectedModule); } } time += 1; finish[vertex] = time; topologicalSortedGraph.AddFirst(vertex); }
public void computeShortestPaths(GraphAdjList adjList, int source) { initializeSingleSource(source); extractEdges(adjList); for (int i = 0; i < V; i++) { Q.insertHeap(new HeapClass() { data = i, priority = distances[i] }); } while (Q.count() != 0) { HeapClass elem = Q.getMax(); foreach (var v in adjList.getAdj(elem.data)) { relax(elem.data, v.Item1, v.Item2); } } Console.WriteLine("\nvertex\tparent\tdistance"); for (int i = 0; i < V; i++) { Console.WriteLine(i + "\t" + parents[i] + "\t" + (-1 * distances[i]).ToString()); } }
void extractEdges(GraphAdjList adjList) { for (int i = 0; i < V; i++) { foreach (var v in adjList.getAdj(i)) { edges.Add(new Tuple <int, int, int>(i, v.Item1, v.Item2)); } } }
public void computeDFS(GraphAdjList adjList, int V, Dictionary <int, string> map, bool isStronglyConnectedModule) { time = 0; //color[startIndex] = -1; if (!isStronglyConnectedModule) { for (int v = 0; v < V; v++) { if (color[v] == -1) { DFSUtil(adjList, map, v, isStronglyConnectedModule); } } } else { int count = 1; List <int> finish_list = new List <int>(finish); var sorted = finish_list .Select((x, i) => new KeyValuePair <int, int>(x, i)) .OrderByDescending(x => x.Key) .ToList(); List <int> idx = sorted.Select(x => x.Value).ToList(); initializeArrays(V); foreach (var v in idx) { //Console.Write(v.ToString() + " "); if (color[v] == -1) { Console.Write("\ncount = " + count++.ToString() + " th strongly connected component : "); DFSUtil(adjList, map, v, isStronglyConnectedModule); } } } }
private void initialize(GraphAdjList adjList) { for (int i = 0; i < V; i++) { foreach (var v in adjList.getAdj(i)) { if (!(edges.Contains(new Tuple <int, int, int>(i, v.Item1, v.Item2)) || edges.Contains(new Tuple <int, int, int>(v.Item1, i, v.Item2)))) { edges.Add(new Tuple <int, int, int>(i, v.Item1, v.Item2)); } } } for (int i = 0; i < V; i++) { Q.insertHeap(new HeapClass() { data = i, priority = -1000 }); parents[i] = -1; } }
public static void Main(string[] args) { Dictionary <int, string> map = new Dictionary <int, string>(); map.Add(0, "S"); map.Add(1, "T"); map.Add(2, "X"); map.Add(3, "Y"); map.Add(4, "Z"); //map.Add(5, "F"); //map.Add(6, "G"); //map.Add(7, "H"); //GraphAdjList mainGraph = new GraphAdjList(7); //mainGraph.addEdge(0, 6); //mainGraph.addEdge(0, 1); //mainGraph.addEdge(0, 2); //mainGraph.addEdge(0, 3); //mainGraph.addEdge(1, 6); //mainGraph.addEdge(1, 0); //mainGraph.addEdge(1, 2); //mainGraph.addEdge(1, 5); //mainGraph.addEdge(2, 6); //mainGraph.addEdge(2, 0); //mainGraph.addEdge(2, 1); //mainGraph.addEdge(2, 4); //mainGraph.addEdge(3, 0); //mainGraph.addEdge(4, 2); //mainGraph.addEdge(5, 1); //mainGraph.addEdge(6, 1); //mainGraph.addEdge(6, 2); //mainGraph.addEdge(6, 5); //mainGraph.addEdge(6, 0); int numberOfVertices = 5; GraphAdjList mainGraph = new GraphAdjList(numberOfVertices); //mainGraph.addEdge(0, 1, 0, false); //mainGraph.addEdge(1, 4, 0, false); //mainGraph.addEdge(1, 5, 0, false); //mainGraph.addEdge(2, 6, 0, false); //mainGraph.addEdge(2, 3, 0, false); //mainGraph.addEdge(3, 2, 0, false); //mainGraph.addEdge(3, 7, 0, false); //mainGraph.addEdge(4, 0, 0, false); //mainGraph.addEdge(4, 5, 0, false); //mainGraph.addEdge(5, 6, 0, false); //mainGraph.addEdge(6, 7, 0, false); //mainGraph.addEdge(6, 5, 0, false); //mainGraph.addEdge(7, 7, 0, false); //GraphAdjList transposeGraph = new GraphAdjList(numberOfVertices); //for (int i = 0; i < numberOfVertices; i++) //{ // foreach (var j in mainGraph.getAdj(i)) // { // transposeGraph.addEdge(j.Item1, i, j.Item2, false); // } //} //int queryIndex = 1; //Console.WriteLine(map[queryIndex] + "'s Friends : "); //List<int> friends = mainGraph.getAdj(queryIndex); //foreach (var v in friends) // Console.WriteLine("\n" + map[v]); //BFS oBFS = new BFS(); //Console.WriteLine("\n\nstart vertex : AB, BFS is : "); //oBFS.computeBFS(mainGraph, numberOfVertices, 0, map); //Console.WriteLine("\n\nstart vertex : SRP, BFS is : "); //oBFS.computeBFS(mainGraph, numberOfVertices, 5, map); //mainGraph.addEdge(0, 1, 4, false); //mainGraph.addEdge(0, 7, 8, false); //mainGraph.addEdge(1, 7, 11, false); //mainGraph.addEdge(1, 2, 8, false); //mainGraph.addEdge(2, 1, 8, false); //mainGraph.addEdge(2, 3, 7, false); //mainGraph.addEdge(2, 5, 4, false); //mainGraph.addEdge(2, 8, 2, false); //mainGraph.addEdge(3, 2, 7, false); //mainGraph.addEdge(3, 4, 9, false); //mainGraph.addEdge(3, 5, 14, false); //mainGraph.addEdge(4, 3, 9, false); //mainGraph.addEdge(4, 5, 10, false); //mainGraph.addEdge(5, 2, 4, false); //mainGraph.addEdge(5, 3, 14, false); //mainGraph.addEdge(5, 4, 10, false); //mainGraph.addEdge(5, 6, 2, false); //mainGraph.addEdge(6, 5, 2, false); //mainGraph.addEdge(6, 7, 1, false); //mainGraph.addEdge(6, 8, 6, false); //mainGraph.addEdge(7, 0, 8, false); //mainGraph.addEdge(7, 1, 11, false); //mainGraph.addEdge(7, 6, 1, false); //mainGraph.addEdge(7, 8, 7, false); //mainGraph.addEdge(8, 2, 2, false); //mainGraph.addEdge(8, 6, 6, false); //mainGraph.addEdge(8, 7, 7, false); //Kruskal oKruskal = new Kruskal(); //oKruskal.computeMST(mainGraph, numberOfVertices); //Prim oPrim = new Prim(numberOfVertices); //oPrim.computeMST(mainGraph, 0); //DFS oDFS = new DFS(); //oDFS.initializeArrays(numberOfVertices); //oDFS.computeDFS(mainGraph, numberOfVertices, map, false); //oDFS.printDFS(numberOfVertices); //oDFS.printTopologicallySorted(); //oDFS.computeDFS(transposeGraph, numberOfVertices, map, true); // shortest paths graph //mainGraph.addEdge(0, 1, 10, true); //mainGraph.addEdge(0, 3, 5, true); //mainGraph.addEdge(1, 2, 1, true); //mainGraph.addEdge(1, 3, 2, true); //mainGraph.addEdge(2, 4, 4, true); //mainGraph.addEdge(3, 1, 3, true); //mainGraph.addEdge(3, 2, 9, true); //mainGraph.addEdge(3, 4, 2, true); //mainGraph.addEdge(4, 0, 7, true); //mainGraph.addEdge(4, 2, 6, true); //snake and ladder mainGraph.addEdge(0, 1, 1, true); mainGraph.addEdge(1, 2, 1, true); mainGraph.addEdge(2, 3, 1, true); mainGraph.addEdge(3, 4, 1, true); mainGraph.addEdge(4, 5, 1, true); mainGraph.addEdge(5, 6, 1, true); mainGraph.addEdge(6, 7, 1, true); mainGraph.addEdge(7, 8, 1, true); mainGraph.addEdge(8, 9, 1, true); mainGraph.addEdge(9, 10, 1, true); mainGraph.addEdge(10, 11, 1, true); mainGraph.addEdge(11, 12, 1, true); mainGraph.addEdge(12, 13, 1, true); mainGraph.addEdge(13, 14, 1, true); mainGraph.addEdge(14, 15, 1, true); mainGraph.addEdge(15, 16, 1, true); mainGraph.addEdge(16, 17, 1, true); mainGraph.addEdge(17, 18, 1, true); mainGraph.addEdge(18, 19, 1, true); mainGraph.addEdge(19, 20, 1, true); mainGraph.addEdge(20, 21, 1, true); mainGraph.addEdge(21, 22, 1, true); mainGraph.addEdge(22, 23, 1, true); mainGraph.addEdge(23, 24, 1, true); mainGraph.addEdge(24, 25, 1, true); mainGraph.addEdge(25, 26, 1, true); mainGraph.addEdge(26, 27, 1, true); mainGraph.addEdge(27, 28, 1, true); mainGraph.addEdge(28, 29, 1, true); mainGraph.addEdge(3, 22, 1, true); mainGraph.addEdge(5, 8, 1, true); mainGraph.addEdge(11, 26, 1, true); mainGraph.addEdge(20, 29, 1, true); mainGraph.addEdge(17, 4, 1, true); mainGraph.addEdge(19, 7, 1, true); mainGraph.addEdge(21, 9, 1, true); mainGraph.addEdge(27, 1, 1, true); Console.WriteLine("bellman ford : "); BellmanFord obf = new BellmanFord(numberOfVertices); obf.computeShortestPaths(mainGraph, 0); Console.WriteLine("dijkstra : "); Dijkstra oDij = new Dijkstra(numberOfVertices); oDij.computeShortestPaths(mainGraph, 0); }