当前位置:   article > 正文

华为机考笔试题 找城市_找个一条尽可能长的访问路径 地图上有100个城市,前20个城市为必须访问的城市,

找个一条尽可能长的访问路径 地图上有100个城市,前20个城市为必须访问的城市,

一个城市规划问题,一个地图有很多城市,两个城市之间只有一种路径,切断通往一个城市i的所有路径之后,其他的城市形成了独立的城市群,这些城市群里最大的城市数量,就是聚集度DPi,现在给出一个地图上各个城市的路径,输出聚集度最小的城市,如果有多个结果,按照编号从小到大
第一行输入 城市节点数目N
后面N-1输入城市之间的路径
栗子:
输入
5
1 2
2 3
3 4
4 5
输出 3
将通往3的所有路径切断,最大城市群数量是2,其他任意城市切断后,最大城市群数量都比2大,所以输出3
输入
6
1 2
2 3
2 4
3 5
3 6
输出 2 3

我采用了并查集的方法解题,循环n次遍历所有城市的结果,每个城市遍历所有的链接信息,如果出现当前循环需要排除的城市,则不执行本次合并操作。

  1. import java.util.*;
  2. public class Main {
  3. public static void main(String[] args) {
  4. Scanner scanner = new Scanner(System.in);
  5. int n = scanner.nextInt();
  6. int i, j;
  7. int[] xPos = new int[n];
  8. int[] yPos = new int[n];
  9. for (i=1; i<n; i++) {
  10. xPos[i] = scanner.nextInt();
  11. yPos[i] = scanner.nextInt();
  12. }
  13. if (n == 1) {
  14. System.out.println(1);
  15. } else if (n == 2) {
  16. System.out.println(1);
  17. System.out.println(2);
  18. } else {
  19. sortPos(xPos, yPos, n);
  20. int min = 1005;
  21. int max;
  22. int totalCity;
  23. List<Integer> minCityList = new ArrayList<>();
  24. for (i = 1; i <= n; i++) {
  25. CityNode[] cityNodes = new CityNode[n + 1];
  26. max = 0;
  27. // 初始化cityNodes
  28. for (j = 1; j <= n; j++) {
  29. cityNodes[j] = new CityNode(j);
  30. }
  31. for (j = 1; j < n; j++) {
  32. // 被剔除city关系不处理
  33. if (xPos[j] == i || yPos[j] == i) {
  34. continue;
  35. }
  36. CityNode yCity = cityNodes[yPos[j]];
  37. CityNode xCity = cityNodes[xPos[j]];
  38. // 如果xCity不是根,xCity找到根
  39. if (xCity.parent != xCity.val) {
  40. xCity = cityNodes[xCity.parent];
  41. }
  42. if (yCity.parent == yCity.val) {
  43. mergeCity(xCity, yCity);
  44. } else {
  45. CityNode yCityParent = cityNodes[yCity.parent];
  46. mergeCity(xCity, yCityParent);
  47. }
  48. }
  49. for (j = 1; j <= n; j++) {
  50. if (cityNodes[j].parent == cityNodes[j].val) {
  51. totalCity = cityNodes[j].children.size() + 1;
  52. max = max < totalCity ? totalCity : max;
  53. }
  54. }
  55. if (min > max) {
  56. min = max;
  57. minCityList.clear();
  58. minCityList.add(i);
  59. } else if (min == max) {
  60. minCityList.add(i);
  61. }
  62. }
  63. minCityList.forEach(item -> System.out.println(item));
  64. }
  65. }
  66. private static void mergeCity(CityNode parentCity, CityNode childCity) {
  67. childCity.parent = parentCity.val;
  68. parentCity.children.add(childCity);
  69. for (CityNode city : childCity.children) {
  70. city.parent = parentCity.val;
  71. parentCity.children.add(city);
  72. }
  73. childCity.children.clear();
  74. }
  75. private static void sortPos(int[] xPos, int[] yPos, int n) {
  76. int i, j, temp;
  77. // 调整前小后大
  78. for (i=0; i<n; i++) {
  79. if (xPos[i] > yPos[i]) {
  80. temp = xPos[i];
  81. xPos[i] = yPos[i];
  82. yPos[i] = temp;
  83. }
  84. }
  85. // 调整整体顺序
  86. for (i=0; i<n; i++) {
  87. for (j=0; j<n-i-1; j++) {
  88. if ((xPos[i] > xPos[i+1]) || (xPos[i] == xPos[i+1] && yPos[i] > yPos[i+1])) {
  89. temp = xPos[i];
  90. xPos[i] = xPos[i+1];
  91. xPos[i+1] = temp;
  92. temp = yPos[i];
  93. yPos[i] = yPos[i+1];
  94. yPos[i+1] = temp;
  95. }
  96. }
  97. }
  98. }
  99. }
  100. class CityNode {
  101. int val;
  102. int parent;
  103. List<CityNode> children = new ArrayList<>();
  104. public CityNode(int val) {
  105. this.val = val;
  106. this.parent = val;
  107. }
  108. }

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号