参加宴会--简单的迪杰斯特拉

题目链接:参加宴会

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class source {
public static void main(String[] args) throws Exception{
final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());

st = new StringTokenizer(br.readLine());
int finalPoint = Integer.parseInt(st.nextToken());

int[][] road = new int[N+1][N+1];
for(int i = 0;i<=N;i++){
for(int j = 0;j<=N;j++){
road[i][j] = Integer.MAX_VALUE;
}
}

int start;
int end;
int cost;
for(int i = 0;i<M;i++){
st = new StringTokenizer(br.readLine());
start = Integer.parseInt(st.nextToken());
end = Integer.parseInt(st.nextToken());
cost = Integer.parseInt(st.nextToken());
road[start][end] = cost;
}

int[] toTargetDist = djSearch(road,1);
int distance1 = toTargetDist[finalPoint];
if(distance1 == Integer.MAX_VALUE){
System.out.println("NO");
return;
}

int[] goBackDist = djSearch(road,finalPoint);
int distance2 = goBackDist[1];
if(distance2 == Integer.MAX_VALUE){
System.out.println("NO");
return;
}
int result = distance1+distance2;
System.out.println("YES");
System.out.println(result);
}

private static int[] djSearch(int[][] graph, int start) {
boolean[] isMinPoint = new boolean[graph.length];
isMinPoint[start] = true;
int[] minDistance = new int[graph.length];

for (int i = 1; i < graph.length; i++) {
if (i == start) {
minDistance[i] = 0;
continue;
}
minDistance[i] = graph[start][i];
}

int minPoint = -1;
int tempMin;
for (int j = 1; j < graph.length; j++) {
tempMin = Integer.MAX_VALUE;
for (int k = 1; k < graph.length; k++) { if (!isMinPoint[k] && tempMin > minDistance[k]) {
tempMin = minDistance[k];
minPoint = k;
}
}
isMinPoint[minPoint] = true;
int compareDist;
for (int k = 1; k < graph.length; k++) { compareDist = graph[minPoint][k] == Integer.MAX_VALUE ? Integer.MAX_VALUE : graph[minPoint][k] + minDistance[minPoint]; if (!isMinPoint[k] && minDistance[k] > compareDist) {
minDistance[k] = compareDist;
}
}
}

return minDistance;
}
}

posted @ 2021-04-30 15:44  Monstro  阅读(51)  评论(0)    收藏  举报