该题就是dijkstra的一个模板,主要是要记住模板,和对模板的使用
AC代码:
import java.io.*;
import java.math.*;
import java.math.BigInteger;
import java.util.*;
public class Main {
static final int N=1050;
static final int INF=0x3f3f3f3f;
static int u,v,w,s,t,n,m;
static int arr[][]=new int [N][N];
static int a[]=new int [N];
static boolean bool[]=new boolean[N];
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
for(;;) {
n=sc.nextInt();//路口数量,1为商店所在地
m=sc.nextInt();//路的数量
if(n==0&&m==0)break;
//A,B,C:AB之间有条路,需要时间C
for(int i=0;i<N;i++) {
for(int j=0;j<N;j++) {
arr[i][j]=INF;
}
}
for(int i=0;i<m;i++) {
u=sc.nextInt();
v=sc.nextInt();
w=sc.nextInt();
arr[u][v]=arr[v][u]=w;
}
s=1;
t=n;
dijkstra();
System.out.println(a[t]);
}
}
private static void dijkstra() {
for(int i=1;i<N;i++) {
a[i]=INF;
bool[i]=false;
}
a[s]=0;
for(int i=0;i<n;i++) {
int k=-1;
int min=INF;
for(int j=1;j<=n;j++) {
if(!bool[j]&&a[j]<min) {
min=a[j];
k=j;
}
}
if(k==-1)break;
bool[k]=true;
for(int j=1;j<=n;j++) {
if(!bool[j]&&a[k]+arr[k][j]<a[j]) {
a[j]=a[k]+arr[k][j];
}
}
}
}
}