fork download
  1. import java.io.*;
  2. import java.util.*;
  3.  
  4. public class Main {
  5. static class Edge {
  6. int to;
  7. long w;
  8. Edge(int to, long w) { this.to = to; this.w = w; }
  9. }
  10.  
  11. static long[] minimaxDijkstra(int src, List<Edge>[] adj, int n) {
  12. long[] dist = new long[n+1];
  13. Arrays.fill(dist, Long.MAX_VALUE);
  14. PriorityQueue<long[]> pq = new PriorityQueue<>(Comparator.comparingLong(a -> a[0]));
  15. dist[src] = 0;
  16. pq.offer(new long[]{0, src});
  17. while (!pq.isEmpty()) {
  18. long[] cur = pq.poll();
  19. long d = cur[0];
  20. int u = (int)cur[1];
  21. if (d > dist[u]) continue;
  22. for (Edge e : adj[u]) {
  23. long nd = Math.max(d, e.w);
  24. if (nd < dist[e.to]) {
  25. dist[e.to] = nd;
  26. pq.offer(new long[]{nd, e.to});
  27. }
  28. }
  29. }
  30. return dist;
  31. }
  32.  
  33. public static void main(String[] args) throws IOException {
  34. PrintWriter out = new PrintWriter(System.out);
  35. int t = Integer.parseInt(br.readLine().trim());
  36. while (t-- > 0) {
  37. StringTokenizer st = new StringTokenizer(br.readLine());
  38. int n = Integer.parseInt(st.nextToken()), m = Integer.parseInt(st.nextToken());
  39. List<Edge>[] adj = new List[n+1];
  40. for (int i = 1; i <= n; i++) adj[i] = new ArrayList<>();
  41. int[] U = new int[m], V = new int[m];
  42. long[] W = new long[m];
  43. for (int i = 0; i < m; i++) {
  44. st = new StringTokenizer(br.readLine());
  45. U[i] = Integer.parseInt(st.nextToken());
  46. V[i] = Integer.parseInt(st.nextToken());
  47. W[i] = Long.parseLong(st.nextToken());
  48. adj[U[i]].add(new Edge(V[i], W[i]));
  49. adj[V[i]].add(new Edge(U[i], W[i]));
  50. }
  51. long[] dist1 = minimaxDijkstra(1, adj, n);
  52. long[] distN = minimaxDijkstra(n, adj, n);
  53. long ans = Long.MAX_VALUE;
  54. for (int i = 0; i < m; i++) {
  55. int u = U[i], v = V[i];
  56. long w = W[i];
  57. long c1 = w + Math.max(w, Math.max(dist1[u], distN[v]));
  58. long c2 = w + Math.max(w, Math.max(dist1[v], distN[u]));
  59. ans = Math.min(ans, Math.min(c1, c2));
  60. }
  61. out.println(ans);
  62. }
  63. out.flush();
  64. }
  65. }
  66.  
Success #stdin #stdout 0.08s 53752KB
stdin
4
3 2
1 2 1
2 3 1
3 2
1 3 13
1 2 5
8 9
1 2 6
2 3 5
3 8 6
1 4 7
4 5 4
5 8 7
1 6 5
6 7 5
7 8 5
3 3
1 3 9
1 2 8
2 3 3
stdout
2
18
10
11