题目描述
德克萨斯纯朴的民众们这个夏天正在遭受巨大的热浪!!!
他们的德克萨斯长角牛吃起来不错,可是它们并不是很擅长生产富含奶油的乳制品。
农夫John此时身先士卒地承担起向德克萨斯运送大量的营养冰凉的牛奶的重任,以减轻德克萨斯人忍受酷暑的痛苦。
John已经研究过可以把牛奶从威斯康星运送到德克萨斯州的路线。
这些路线包括起始点和终点一共有 T 个城镇,为了方便标号为 1 到 T。
除了起点和终点外的每个城镇都由 双向道路 连向至少两个其它的城镇。
每条道路有一个通过费用(包括油费,过路费等等)。
给定一个地图,包含 C 条直接连接 2 个城镇的道路。
每条道路由道路的起点 Rs,终点 Re 和花费 Ci 组成。
求从起始的城镇 Ts 到终点的城镇 Te 最小的总费用。
输入格式
第一行: 4 个由空格隔开的整数: T,C,Ts,Te;
第 2 到第 C+1 行: 第 i+1 行描述第 i 条道路,包含 3 个由空格隔开的整数: Rs,Re,Ci。
输出格式
一个单独的整数表示从 Ts 到 Te 的最小总费用。
数据保证至少存在一条道路。
数据范围
1≤T≤2500,
1≤C≤6200,
1≤Ts,Te,Rs,Re≤T,
1≤Ci≤1000
输入样例:
7 11 5 4
2 4 2
1 4 3
7 2 2
3 4 3
5 7 5
7 3 3
6 1 1
6 3 4
2 4 3
5 6 3
7 2 1
输出样例:
7
注意这里是从一个城镇到另一个城镇,所以起点和终点都会不是确定的,因此dist[1]和dist[n]的下标要用别的变量来进行替换
import java.io.*;
import java.util.*;
public class Main {
static int n;
static int N=2510;
static int[] dist=new int[N];
static int[][] g=new int[N][N];
static boolean[] st=new boolean[N];
static int Ts;
static int Te;
public static void main(String[] args) throws IOException{
StreamTokenizer re=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
re.nextToken();n=(int)re.nval;
re.nextToken();int C=(int)re.nval;
re.nextToken();Ts=(int)re.nval;
re.nextToken();Te=(int)re.nval;
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
g[i][j]=0x3f3f3f;
if(i==j){
g[i][j]=0;
}
}
}
while(C-->0){
re.nextToken();int a=(int)re.nval;
re.nextToken();int b=(int)re.nval;
re.nextToken();int c=(int)re.nval;
g[a][b]=c;
g[b][a]=c;
}
System.out.print(dijkstra());
}
static int dijkstra(){
Arrays.fill(dist,0x3f3f3f);
dist[Ts]=0;
for(int i=0;i<n;i++){
int t=-1;
for(int j=1;j<=n;j++){
if(!st[j]&&(t==-1||dist[t]>dist[j])){
t=j;
}
}
st[t]=true;
for(int j=1;j<=n;j++){
dist[j]=Math.min(dist[j],dist[t]+g[t][j]);
}
}
if(dist[n]==0x3f3f3f){
return -1;
}
return dist[Te];
}
}