예제 #1
0
파일: Lab03.cs 프로젝트: L-Dogg/ASD2
        /// <summary>Domknięcie grafu</summary>
        /// <param name="g">Graf wejściowy</param>
        /// <returns>Graf będący domknięciem grafu wejściowego</returns>
        /// <remarks>
        /// 1.5 pkt.
        /// Domknięcie grafu to graf, w którym krawędzią połączone są wierzchołki,
        /// pomiędzy którymi istnieje ścieżka w wyjściowym grafie (pętle wykluczamy).
        /// Graf wejściowy pozostaje niezmieniony.
        /// Utworzony graf ma taką samą reprezentację jak graf wejściowy.
        /// Uwaga 1 : w przypadku stwierdzenia ze graf wejściowy jest grafem ważonym zgłosić wyjątek ArgumentException
        /// </remarks>
        public static Graph Closure(this Graph g)
        {
            Graph ret = g.IsolatedVerticesGraph();

            PathsInfo[]    tab   = new PathsInfo[g.VerticesCount];
            HashSet <Edge> elist = new HashSet <Edge>();

            // Dla każdego wierzchołka i znajdź ścieżki do pozostałych wierzchołków:
            for (int i = 0; i < g.VerticesCount; i++)
            {
                if (g.DijkstraShortestPaths(i, out tab))
                {
                    for (int j = 0; j < g.VerticesCount; j++)
                    {
                        // Pomiń pętle:
                        if (i == j)
                        {
                            continue;
                        }

                        if (g.GetEdgeWeight(i, j) > 1)
                        {
                            throw new ArgumentException();
                        }

                        Edge e = new Edge(i, j, 1);
                        if (tab[j].Dist != null && elist.Contains(new Edge(j, i, 1)) == false && elist.Contains(e) == false)
                        {
                            //Console.WriteLine("Adding edge {0} - {1}", i, j);
                            elist.Add(e);
                            ret.AddEdge(e);
                        }
                    }
                }
            }
            // n = |V|

            /*
             * for i=1 to n
             *      do for j = 1 to n
             *              do if i = j lub (i,j) e E(g)
             *                      then t(i,j) = 1
             *                      else t(i,j) = 0
             * for k = 1 to n
             *      do for i = 1 to n
             *              do for j = 1 to n
             *                      t(i,j) = t(i,j) lub (t(i,k) i t(k,j))
             */
            return(ret);            // zmienic !
        }
예제 #2
0
        /// <summary>
        /// Wyznacza koszt ścieżki Hamiltona.
        /// Gdy następuje przeskakiwanie miedzy wierzchołkami, to do sumy dodajemy sumę wag najkrószej ścieżki łączącej te wierzchołki.
        /// </summary>
        public static int costOfHamiltonianPath(Graph g, List <int> cycle)
        {
            int sum = 0;

            List <PathsInfo[]> pathsFromVertices = new List <PathsInfo[]>();

            for (int i = 0; i < g.VerticesCount; i++)
            {
                PathsInfo[] path;
                g.DijkstraShortestPaths(i, out path);
                pathsFromVertices.Add(path);
            }

            for (int i = 0; i < cycle.Count - 1; i++)
            {
                sum += (int)pathsFromVertices[cycle[i]][cycle[i + 1]].Dist;
            }

            return(sum);
        }