用于存放学校的作业便于复习。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

160 lines
7.3 KiB

  1. //
  2. // Created by 423A35C7 on 2023-12-02.
  3. //
  4. #include <iostream>
  5. #include "graph.hpp"
  6. // 这次执行一轮后不一定结束了,
  7. void one_turn(ComplexGraph* graph) {
  8. for (int start = 0; start < graph->node_num; ++start) {
  9. int target;
  10. while (true) {
  11. int* target_ptr = std::min_element(graph->adjacency[start],
  12. graph->adjacency[start] + graph->node_num);
  13. // 如果最小的目标城市距离都是INT_MAX,则说明start与所有城市都已连通,则不再修建
  14. if (*target_ptr == INT_MAX) {
  15. return;
  16. }
  17. target = target_ptr - graph->adjacency[start];
  18. // 如果在同一个城市联盟内,那么把这个目标城市排除,在剩下的目标城市中继续
  19. if (graph->same_league(start, target)) {
  20. graph->adjacency[start][target] = INT_MAX;
  21. continue;
  22. }
  23. // 如果已经修建过了,则换个目标城市
  24. if (graph->incidence[start][target]) {
  25. continue;
  26. }
  27. // 不需要考虑三个或以上成环的情况
  28. break;
  29. }
  30. const int start_alpha = graph->get_alpha(start);
  31. const int target_alpha = graph->get_alpha(target);
  32. // 当城市规模系数α到达限定系数β后,我们认为该 league
  33. // 已经到达“稳定”,不再与任何其他城市修建公路。
  34. if (start_alpha >= graph->beta || target_alpha >= graph->beta) {
  35. continue;
  36. }
  37. if (start_alpha < target_alpha) {
  38. // 规模小于目标城市,则政府拒绝修建
  39. continue;
  40. }
  41. else if (start_alpha == target_alpha) {
  42. // 若两个城市规模相等,则修建过后两座城市形成的 league 城市规模系数α增一
  43. graph->increase_alpha(start);
  44. }
  45. else if (start_alpha > target_alpha) {
  46. // 若大于目标城市,则同意修建,规模系数不变
  47. ;
  48. }
  49. // 修建公路,即在关系矩阵上将相应的行列置为true
  50. graph->incidence[start][target] = graph->incidence[target][start] = true;
  51. graph->incidence_had_changed = true; // 保护字段为什么能直接访问?
  52. // 把目标城市所在联盟合并到起始城市所在联盟中
  53. graph->merge(start, target);
  54. }
  55. }
  56. int main() {
  57. int n, beta;
  58. std::cout << "输入城市的个数:";
  59. std::cin >> n;
  60. auto graph = ComplexGraph(n);
  61. std::cout << "初始的城市规模为:" << std::endl;
  62. graph.print_alpha();
  63. std::cout << "请输入限定系数beta:";
  64. std::cin >> beta;
  65. graph.set_beta(beta);
  66. std::cout << "初始的距离的邻接矩阵为:" << std::endl;
  67. graph.print_adjacency();
  68. for (int turn_num = 1; ; turn_num++) {
  69. graph.start_record_incidence();
  70. one_turn(&graph);
  71. // 当关系矩阵不再被改变,也就是说明不再修桥了,则说明达到稳定
  72. if (!graph.stop_record_incidence()) {
  73. break;
  74. }
  75. std::cout << "" << turn_num << "轮后的关系矩阵如下:" << std::endl;
  76. graph.print_incidence();
  77. std::cout << "规模系数如下:" << std::endl;
  78. graph.print_alpha();
  79. std::cout << "并查集如下:" << std::endl;
  80. graph.print_merge_find_set();
  81. std::cout << std::endl;
  82. }
  83. std::cout << "已经达到稳定" << std::endl;
  84. return 0;
  85. }
  86. // 输入城市的个数:10
  87. // 初始的城市规模为:
  88. // 城市联盟 { 0 } 的规模系数为 2
  89. // 城市联盟 { 1 } 的规模系数为 5
  90. // 城市联盟 { 2 } 的规模系数为 2
  91. // 城市联盟 { 3 } 的规模系数为 1
  92. // 城市联盟 { 4 } 的规模系数为 3
  93. // 城市联盟 { 5 } 的规模系数为 4
  94. // 城市联盟 { 6 } 的规模系数为 2
  95. // 城市联盟 { 7 } 的规模系数为 2
  96. // 城市联盟 { 8 } 的规模系数为 4
  97. // 城市联盟 { 9 } 的规模系数为 3
  98. // 请输入限定系数beta:5
  99. // 初始的距离的邻接矩阵为:
  100. // 2147483647 63 39 34 97 93 35 42 68 29
  101. // 63 2147483647 11 100 82 48 31 2 33 58
  102. // 39 11 2147483647 85 100 27 47 97 86 91
  103. // 34 100 85 2147483647 15 32 16 77 84 29
  104. // 97 82 100 15 2147483647 4 53 63 54 29
  105. // 93 48 27 32 4 2147483647 25 85 86 58
  106. // 35 31 47 16 53 25 2147483647 97 27 88
  107. // 42 2 97 77 63 85 97 2147483647 61 91
  108. // 68 33 86 84 54 86 27 61 2147483647 66
  109. // 29 58 91 29 29 58 88 91 66 2147483647
  110. //
  111. // 第1轮后的关系矩阵如下:
  112. // 0 0 0 0 0 0 0 0 0 1
  113. // 0 0 0 0 0 0 0 0 0 0
  114. // 0 0 0 0 0 0 0 0 0 0
  115. // 0 0 0 0 0 0 1 0 0 0
  116. // 0 0 0 0 0 1 0 0 0 0
  117. // 0 0 0 0 1 0 0 0 0 0
  118. // 0 0 0 1 0 0 0 0 1 0
  119. // 0 0 0 0 0 0 0 0 0 0
  120. // 0 0 0 0 0 0 1 0 0 0
  121. // 1 0 0 0 0 0 0 0 0 0
  122. //
  123. // 规模系数如下:
  124. // 城市联盟 { 1 } 的规模系数为 5
  125. // 城市联盟 { 2 } 的规模系数为 2
  126. // 城市联盟 { 4 5 } 的规模系数为 4
  127. // 城市联盟 { 7 } 的规模系数为 2
  128. // 城市联盟 { 3 6 8 } 的规模系数为 4
  129. // 城市联盟 { 0 9 } 的规模系数为 3
  130. // 并查集如下:
  131. // 9 -1 -1 8 5 -1 8 -1 -1 -1
  132. //
  133. // 第2轮后的关系矩阵如下:
  134. // 0 0 0 0 0 0 0 0 0 1
  135. // 0 0 0 0 0 0 0 0 0 0
  136. // 0 0 0 0 0 0 0 0 0 0
  137. // 0 0 0 0 1 0 1 0 0 0
  138. // 0 0 0 1 0 1 0 0 0 0
  139. // 0 0 0 0 1 0 0 0 0 0
  140. // 0 0 0 1 0 0 0 0 1 0
  141. // 0 0 0 0 0 0 0 0 0 0
  142. // 0 0 0 0 0 0 1 0 0 0
  143. // 1 0 0 0 0 0 0 0 0 0
  144. //
  145. // 规模系数如下:
  146. // 城市联盟 { 1 } 的规模系数为 5
  147. // 城市联盟 { 2 } 的规模系数为 2
  148. // 城市联盟 { 7 } 的规模系数为 2
  149. // 城市联盟 { 3 4 5 6 8 } 的规模系数为 5
  150. // 城市联盟 { 0 9 } 的规模系数为 3
  151. // 并查集如下:
  152. // 9 -1 -1 8 8 8 8 -1 -1 -1
  153. //
  154. // 已经达到稳定