Ejemplo n.º 1
0
        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");
            }
        }
Ejemplo n.º 2
0
        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]);
            }
        }
Ejemplo n.º 3
0
        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");
            }
        }
Ejemplo n.º 4
0
        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]);
            }
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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());
            }
        }
Ejemplo n.º 7
0
 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));
         }
     }
 }
Ejemplo n.º 8
0
        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);
                    }
                }
            }
        }
Ejemplo n.º 9
0
        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;
            }
        }
Ejemplo n.º 10
0
        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);
        }