ChameL1oN

Дискретка_МетодПрима

Apr 8th, 2015
225
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.37 KB | None | 0 0
  1. #include <fstream>
  2. #include <iostream>
  3. #include <locale>
  4.  
  5.  
  6.  
  7.  
  8.  
  9. using namespace std;
  10.  
  11. int n; //Кол-во вершин
  12. int treeline = 0; //Длина дерева
  13. ifstream f("input.txt", ios::in);
  14.  
  15. //Построенние минимального остовного дерева методом Прима
  16.  
  17. void Prim(int** massive,bool* used){
  18. int minlen = 500000; //Абсолютно любое очень большое число
  19. int q, w; //Переменные для хранения информации двух соединяемых вершин
  20. for (int i = 0; i < n; i++){
  21. for (int j = 0; j < n; j++){
  22. if (massive[i][j] < minlen && massive[i][j] > 0 && used[i] == true && used[j] == false){ //Поиск минимального расстояния
  23. minlen = massive[i][j];
  24. q = i;
  25. w = j;
  26. }
  27. }
  28. }
  29. cout << " Связали " << q+1 << " и " << w+1 << " длина = " << treeline << " + " << minlen << endl;
  30. treeline += minlen;
  31. used[w] = true;
  32. }
  33.  
  34. void print(int** massive){
  35. for (int i = 0; i < n; i++){
  36. for (int j = i; j < n; j++){
  37. if (massive[i][j] > 0){
  38. cout << i+1 << "-" << j+1 << "=" << massive[i][j] << " ";
  39. }
  40. }
  41. }
  42. }
  43.  
  44. void main(){
  45. setlocale(LC_ALL, "rus");
  46. f >> n;
  47. bool* used = new bool[n]; //Массив , хранящий информацию о принадлежности вершин к дереву
  48. int** massive = new int*[n]; //Массив матрицы расстояний
  49. for (int i = 0; i < n; i++){
  50. massive[i] = new int[n];
  51. used[i] = false; // Обнуляем массив
  52. for (int j = 0; j < n; j++){
  53. string s;
  54. f >> s;
  55. if (s == "~") massive[i][j] = -1; //Если ~ то считаем как отрицательное число (для расстояния такое невозможно)
  56. else massive[i][j] = atoi(s.c_str()); // atoi = перевод строки в int значение
  57. }
  58. }
  59. print(massive);
  60. cout << endl;
  61. cout << endl;
  62. used[0] = true; //Заносим первую вершину в дерево
  63. for (int i = 0; i < n - 1; i++){ // Кол-во необходимых присоединений для построения дерева = n-1
  64. Prim(massive, used);
  65. }
  66. cout << endl;
  67. cout << endl;
  68. cout << "Длина минимального остовного дерева = " << treeline << endl;;
  69. cout << endl;
  70. }
Advertisement
Add Comment
Please, Sign In to add comment