题意:
给你一个不完全的矩阵,数字表示权值,x表示两点间不可达
由于自身到自身花费的时间为0,所以没有给出,由于i到j和j到i距离相同,互达时间相同
所以只给出了一半的临界矩阵。
根据给你的这个临界矩阵,让你来求从点1到其他点所花费最短时间集里面的的最大值。
一个很直接的最短路
三种单源点最短路径算法都练习了以下,dijkstra,bellman-ford,SPFA
1 import java.util.Scanner; 2 import java.util.Arrays; 3 /* 4 dijkstra 5 */ 6 public class Main{ 7 static int INF = 0x3f3f3f3f; 8 static int n; 9 static boolean visited[]; 10 11 public static void dij(int map[][],int dist[]){ 12 visited[1] = true; 13 int u = 0; 14 for(int i=1;i<n;i++){ 15 int min = INF; 16 for(int j=2;j<=n;j++){ 17 if(visited[j]==false&&min>dist[j]){ 18 min = dist[j]; 19 u = j; 20 } 21 } 22 visited[u] = true; 23 for(int k=2;k<=n;k++){ 24 if(visited[k]==false&&dist[u]+map[u][k]<dist[k]) 25 dist[k] = dist[u]+map[u][k]; 26 } 27 } 28 } 29 30 public static void main(String[] args){ 31 Scanner in = new Scanner(System.in); 32 n = in.nextInt(); 33 in.nextLine(); 34 int map[][] = new int[n+1][n+1]; 35 for(int i=0;i<=n;i++) 36 Arrays.fill(map[i],INF); 37 38 for(int i=2;i<=n;i++){ 39 String nums[] = in.nextLine().split(" "); 40 for(int j=1;j<i;j++){ 41 if(nums[j-1].equals("x")) 42 continue; 43 map[i][j]=map[j][i] = Integer.parseInt(nums[j-1]); 44 } 45 } 46 int dist[] = new int[n+1]; 47 for(int i=2;i<=n;i++) 48 dist[i] = map[1][i]; 49 visited = new boolean[n+1]; 50 dij(map,dist); 51 int max=0; 52 for(int i=2;i<=n;i++) 53 if(dist[i]>max) 54 max = dist[i]; 55 System.out.println(max); 56 } 57 }
1 import java.util.Scanner; 2 import java.util.Arrays; 3 /* 4 bellman-ford 5 */ 6 public class Main{ 7 static int INF = 0x3f3f3f3f; 8 static int n; 9 10 public static void bf(int map[][],int dist[],int v){ 11 for(int k=2;k<n;k++) 12 for(int u=1;u<=n;u++) 13 if(u!=v) 14 for(int i=1;i<=n;i++) 15 if(i!=v&&dist[u]>dist[i]+map[i][u]) 16 dist[u] = dist[i]+map[i][u]; 17 18 } 19 20 public static void main(String[] args){ 21 Scanner in = new Scanner(System.in); 22 n = in.nextInt(); 23 in.nextLine(); 24 int map[][] = new int[n+1][n+1]; 25 for(int i=0;i<=n;i++) 26 Arrays.fill(map[i],INF); 27 28 for(int i=2;i<=n;i++){ 29 String nums[] = in.nextLine().split(" "); 30 for(int j=1;j<i;j++){ 31 if(nums[j-1].equals("x")) 32 continue; 33 map[i][j]=map[j][i] = Integer.parseInt(nums[j-1]); 34 } 35 } 36 int dist[] = new int[n+1]; 37 for(int i=2;i<=n;i++) 38 dist[i] = map[1][i]; 39 bf(map,dist,1); 40 int max=0; 41 for(int i=2;i<=n;i++) 42 if(dist[i]>max) 43 max = dist[i]; 44 System.out.println(max); 45 } 46 }
时间: 2024-10-07 04:10:24