Advertisement
Guest User

Untitled

a guest
Jul 23rd, 2019
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.82 KB | None | 0 0
  1. static int beautifulPath(int[][] edges, int A, int B) {
  2. // count the number of vertices
  3. Set<Integer> vertexSet = new HashSet<Integer>();
  4. for (int i = 0; i < edges.length; i++) {
  5. int v1 = edges[i][0];
  6. int v2 = edges[i][1];
  7. vertexSet.add(v1);
  8. vertexSet.add(v2);
  9. }
  10. int N = vertexSet.size() + 1;
  11. int[][] graph = new int[N][N];
  12. for (int i = 0; i < N; i++) {
  13. for (int j = 0; j < N; j++) {
  14. if (i == j) graph[i][j] = 0;
  15. else graph[i][j] = Integer.MAX_VALUE;
  16. }
  17. }
  18. for (int i = 0; i < edges.length; i++) {
  19. int v1 = edges[i][0];
  20. int v2 = edges[i][1];
  21. graph[v1][v2] = Math.min(graph[v1][v2], edges[i][2]);
  22. graph[v2][v1] = Math.min(graph[v2][v1], edges[i][2]);
  23. }
  24.  
  25. // Now do Dijkstra
  26. boolean[] visited = new boolean[N];
  27. int[] distances = new int[N];
  28.  
  29. Arrays.fill(visited, false);
  30. Arrays.fill(distances, Integer.MAX_VALUE);
  31.  
  32. PriorityQueue<Integer> q = new PriorityQueue<Integer>((v1, v2) -> distances[v1]- distances[v2]);
  33. distances[A] = 0;
  34. q.offer(A);
  35.  
  36. while (!q.isEmpty()) {
  37. int v = q.poll();
  38. if (v == B) return distances[v];
  39.  
  40. for (int i = 1; i < N; i++) {
  41. if (i != v && graph[v][i] != Integer.MAX_VALUE && !visited[i]) {
  42. int newDist = distances[v] | graph[v][i];
  43. if (newDist < distances[i]) {
  44. q.remove(i);
  45. distances[i] = newDist;
  46. q.offer(i);
  47. }
  48. }
  49. }
  50. visited[v] = true;
  51. }
  52. return -1;
  53. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement