/// <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 ! }
/// <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); }