用于存放学校的作业便于复习。
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.

93 lines
3.9 KiB

  1. /*
  2. *
  3. * 1. 使merge或者inplace_merge
  4. * 2. 使priority_queue
  5. * 3. 使multiset
  6. *
  7. * $n$$n^2$
  8. * n-1
  9. * merge吧
  10. */
  11. /*
  12. *
  13. * ABC三个城市存在环A申请修建ABB申请修建BCC申请修建CA
  14. * AB < AC, BC < BA, CA < CB
  15. * AB < AC < BC < ABAB < AB是不可能的
  16. * n个城市n > 2
  17. */
  18. /*
  19. * n个城市一轮后就会修建了
  20. * n条公路n-1使
  21. */
  22. #include <iostream>
  23. #include "graph.hpp"
  24. // 一轮
  25. void one_turn(Graph* graph) {
  26. for (int start = 0; start < graph->node_num; ++start) {
  27. int target;
  28. while (true) {
  29. int* target_ptr = std::min_element(graph->adjacency[start],
  30. graph->adjacency[start] + graph->node_num);
  31. // 如果最小的目标城市距离都是INT_MAX,则说明start与所有城市都已连通,则不再修建
  32. if (*target_ptr == INT_MAX) {
  33. return;
  34. }
  35. target = target_ptr - graph->adjacency[start];
  36. // 如果在同一个城市联盟内,那么把这个目标城市排除,在剩下的目标城市中继续
  37. if (graph->same_league(start, target)) {
  38. graph->adjacency[start][target] = INT_MAX;
  39. continue;
  40. }
  41. // 如果已经修建过了,则换个目标城市
  42. if (graph->incidence[start][target]) {
  43. continue;
  44. }
  45. // 不需要考虑三个或以上成环的情况
  46. break;
  47. }
  48. // 修建公路,即在关系矩阵上将相应的行列置为true
  49. graph->incidence[start][target] = graph->incidence[target][start] = true;
  50. // 把目标城市所在联盟合并到起始城市所在联盟中
  51. graph->merge(start, target);
  52. }
  53. }
  54. int main() {
  55. int n;
  56. std::cout << "输入城市的个数:";
  57. std::cin >> n;
  58. auto graph = Graph(n);
  59. std::cout << "初始的距离的邻接矩阵为:" << std::endl;
  60. graph.print_adjacency();
  61. one_turn(&graph);
  62. std::cout << "第一轮后的关系矩阵如下:" << std::endl;
  63. graph.print_incidence();
  64. std::cout << "并查集如下:" << std::endl;
  65. graph.print_merge_find_set();
  66. std::cout << "可以看到,一轮后就已经全部连通。" << std::endl;
  67. return 0;
  68. }
  69. // 输入城市的个数:5
  70. // 初始的距离的邻接矩阵为:
  71. // 2147483647 69 19 14 90
  72. // 69 2147483647 66 82 66
  73. // 19 66 2147483647 48 8
  74. // 14 82 48 2147483647 22
  75. // 90 66 8 22 2147483647
  76. //
  77. // 第一轮后的关系矩阵如下:
  78. // 0 0 0 1 0
  79. // 0 0 1 0 0
  80. // 0 1 0 0 1
  81. // 1 0 0 0 1
  82. // 0 0 1 1 0
  83. //
  84. // 并查集如下:
  85. // -1 0 0 0 0
  86. // 可以看到,一轮后就已经全部连通。