重型物体运输问题

x33g5p2x  于2022-07-10 转载在 其他  
字(2.7k)|赞(0)|评价(0)|浏览(391)

一 原问题链接

1797 -- Heavy Transportation

http://poj.org/problem?id=1797

二输入和输出

1 输入

第1行包含测试用例数量。每个测试用例的第1行都包含 n和m,分别表示街道交叉口的数量和角度的数量。以下 m 行,每行都包含3个整数,分别表示街道的开始、结束和承重。在每对交叉点之间最多有一个条街道。

2 输出

对每个测试用例,输出都以包含“Scenario #i:”行开头,其中 i 是从 1 开始的测试用例编号。然后单行输出可以运输给客户的最大承重。在测试用例之间有一个空行。

三 输入和输出样例

1 输入样例

1

3 3

1 2 3

1 3 4

2 3 5

2 输出样例

Scenario #1:

4

四 分析

本问题要求找到一条通路,是最小边权最大的通路,该通路的最小边权即最大承重。

如下图所示,从节点1到节点6有3条通路,其中1-2-4-6 的最小边权为3,1-3-4-6 的最小边权为4,1-3-5-6 的最小边权为2;最小边权最大的通路为1-3-4-6,该通路的最大承重为4,超过4则无法承受。

五 算法设计

1 将所有的街道都采用链式前向星存储,每个街道都是双向的。

2 将 Dijkstra 算法的更新条件变形一下,改为最小值最大的更新。

六 代码

  1. package graph.poj1797;
  2. import javafx.util.Pair;
  3. import java.util.PriorityQueue;
  4. import java.util.Scanner;
  5. public class POJ1797 {
  6. static final int maxn = 1005;
  7. static final int maxe = 1000001;
  8. static final int inf = 0x3f3f3f3f;
  9. static int T;
  10. static int n;
  11. static int m;
  12. static int w;
  13. static int cnt;
  14. static int head[] = new int[maxn];
  15. static int dis[] = new int[maxn];
  16. static Edge e[] = new Edge[maxe];
  17. // 标记是否已访问
  18. static boolean vis[] = new boolean[maxn];
  19. static {
  20. for (int i = 0; i < vis.length; i++) {
  21. vis[i] = false;
  22. }
  23. for (int i = 0; i < dis.length; i++) {
  24. dis[i] = 0;
  25. }
  26. for (int i = 0; i < e.length; i++) {
  27. e[i] = new Edge();
  28. }
  29. }
  30. static void add(int u, int v, int w) {
  31. e[cnt].to = v;
  32. e[cnt].next = head[u];
  33. e[cnt].w = w;
  34. head[u] = cnt++;
  35. }
  36. // dijkstra 算法变形,求最小值最大的路径
  37. static void solve(int u) {
  38. PriorityQueue<MyPair<Integer, Integer>> q = new PriorityQueue<>();
  39. dis[u] = inf;
  40. MyPair pair = new MyPair(dis[u], u);
  41. q.add(pair); // 最大值优先
  42. while (!q.isEmpty()) {
  43. int x = (int) q.peek().getValue();
  44. q.poll();
  45. if (vis[x])
  46. continue;
  47. vis[x] = true;
  48. if (vis[n])
  49. return;
  50. for (int i = head[x]; i >= 0; i = e[i].next) {
  51. int v = e[i].to;
  52. if (vis[v])
  53. continue;
  54. if (dis[v] < Math.min(dis[x], e[i].w)) { // 求最小值最大的
  55. dis[v] = Math.min(dis[x], e[i].w);
  56. q.add(new MyPair(dis[v], v));
  57. }
  58. }
  59. }
  60. }
  61. public static void main(String[] args) {
  62. int p = 1;
  63. Scanner scanner = new Scanner(System.in);
  64. T = scanner.nextInt();
  65. while (T-- > 0) {
  66. cnt = 0;
  67. for (int i = 0; i < head.length; i++) {
  68. head[i] = -1;
  69. }
  70. n = scanner.nextInt();
  71. m = scanner.nextInt();
  72. int u, v, w;
  73. for (int i = 1; i <= m; i++) {
  74. u = scanner.nextInt();
  75. v = scanner.nextInt();
  76. w = scanner.nextInt();
  77. add(u, v, w);//两条边
  78. add(v, u, w);
  79. }
  80. solve(1);
  81. System.out.println("Scenario #" + p++ + ":");
  82. System.out.println(dis[n]);
  83. System.out.println();
  84. }
  85. }
  86. }
  87. class Edge {
  88. int to;
  89. int w;
  90. int next;
  91. }
  92. class MyPair<K, V> extends Pair implements Comparable {
  93. /**
  94. * Creates a new pair
  95. *
  96. * @param key The key for this pair
  97. * @param value The value to use for this pair
  98. */
  99. public MyPair(Object key, Object value) {
  100. super(key, value);
  101. }
  102. @Override
  103. public int compareTo(Object pair) {
  104. if ((Integer) this.getKey() > (Integer) (((Pair) pair).getKey())) {
  105. return 1;
  106. } else if ((Integer) this.getKey() < (Integer) (((Pair) pair).getKey())) {
  107. return -1;
  108. } else {
  109. return 0;
  110. }
  111. }
  112. }

七 测试

绿色为输入,白色为输出

八 参考

线程"main“java.lang.ClassCastException中出现异常: javafx.util.Pair不能强制转换为java.lang.Comparable - 问答 - 腾讯云开发者社区-腾讯云另外,这个问题已经问了很多次了,我无法根据我的解决方案来解决这个问题。我正在编写加权图的Dijkstra算法。我使用ArrayList>>来存储我的权重和边。在实现Dijkstra函数时,我使用了M...

https://cloud.tencent.com/developer/ask/sof/1269961

相关文章