这道题的大意是:由于战争,一个商人想从城市1,回到自己的家城市2,其中城市1始终是由领导1,城市2始终由领导2,其中,商人回家的路中只能有一条路上连接由两个领导领导的城市,还有就是给出的路上双向的,也就是如果城市1能到城市2,那么城市2也同样能到城市1,这是关键。解题算法,最短路径,我用的是dijkstra,代码如下:
package poj; import java.util.Scanner; public class Main3767 { public static void dijkstra(int[][] GA, int[] leader, int road) { if (road == 0) System.out.println(-1); else { int size = GA.length; // System.out.println(size); int[] dist = new int[size]; int[] isUsed = new int[size]; isUsed[1] = 1; dist[1] = Integer.MAX_VALUE; for (int i = 2; i < size; i++) { dist[i] = GA[1][i]; } for (int i = 1; i < size - 2; i++) { int min = Integer.MAX_VALUE; int m = 0; for (int j = 1; j < size; ++j) { if (isUsed[j] == 0 && dist[j] < min) { min = dist[j]; m = j; } } if (m != 0) isUsed[m] = 1; else break; for (int j = 1; j < size; ++j) { if (isUsed[j] == 0 && (leader[m] == leader[j] || leader[j] == 2) && GA[m][j] != Integer.MAX_VALUE && dist[m] + GA[m][j] < dist[j]) { dist[j] = dist[m] + GA[m][j]; } } } System.out.println(dist[2] == Integer.MAX_VALUE ? -1 : dist[2]); } } public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNextInt()) { int countCity = sc.nextInt(); if (countCity == 0) break; int road = sc.nextInt(); int[][] GA = new int[countCity + 1][countCity + 1]; for (int i = 1; i <= countCity; ++i) { for (int j = 1; j <= countCity; ++j) { GA[i][j] = Integer.MAX_VALUE; } } for (int i = 0; i < road; ++i) { int c1 = sc.nextInt(); int c2 = sc.nextInt(); GA[c1][c2] = sc.nextInt(); GA[c2][c1] = GA[c1][c2]; } int[] leader = new int[countCity + 1]; for (int i = 1; i < countCity + 1; ++i) leader[i] = sc.nextInt(); dijkstra(GA, leader, road); } } }
本文探讨了在受到战争影响的环境下,一个商人如何通过Dijkstra算法找到从城市1到城市2的最短路径,避免两个由不同领导控制的城市间的直接联系。详细介绍了算法实现过程及其实验代码。
902

被折叠的 条评论
为什么被折叠?



