最短路径模板题,很久很做图论,都有点忘了,复习下。
讲解博客也记录下方便看:
Dijsktra:
import java.util.*;
public class Main{
static Scanner sc = new Scanner(System.in);
static int n, m, a, b, c;
static int [] dis;
static int [][] map;
static int [] vis;
static int MAX_VALUE = 10000000;//注意这里不用Integer.MAX_VALUE,因为下面要进行加法运算,会爆int
static void dijkstra() {
for(int i = 1; i <= n; i++) {
dis[i] = map[1][i];
}
vis[1] = 1; dis[1] = 0;
for(int i = 0; i < n; i++) {
int newPos = 0, min = MAX_VALUE;
for(int j = 1; j <= n; j++) {
if(vis[j] == 0 && min > dis[j]) {
min = dis[j];
newPos = j;
}
}
vis[newPos] = 1;
for(int j = 1; j <= n; j++) {
if(vis[j] ==0 && map[newPos][j]+dis[newPos] < dis[j]) {
dis[j] = map[newPos][j]+dis[newPos];
}
}
}
}
public static void main(String[] args) {
while(sc.hasNext()) {
n = sc.nextInt(); m = sc.nextInt();
if(n == 0 && m == 0) break;
dis = new int[n+1];
map = new int[n+1][n+1];
vis = new int[n+1];
for(int i = 1; i <= n; i++)
Arrays.fill(map[i], MAX_VALUE);
for(int i = 0; i < m; i++) {
a = sc.nextInt(); b = sc.nextInt(); c = sc.nextInt();
if(c < map[a][b]) {
map[a][b] = c;
map[b][a] = c;
}
}
dijkstra();
System.out.println(dis[n]);
}
}
}
Floyd:
import java.util.*;
public class Main{
static Scanner sc = new Scanner(System.in);
static int n, m, a, b, c;
static int [][] map;
static int MAX_VALUE = 10000000;
static void floyd() {
for(int k = 1; k <= n; k++) {
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
if(map[i][j] > map[i][k] + map[k][j])
map[i][j] = map[i][k] + map[k][j];
}
}
}
}
public static void main(String[] args) {
while(sc.hasNext()) {
n = sc.nextInt(); m = sc.nextInt();
if(n == 0 && m == 0) break;
map = new int[n+1][n+1];
for(int i = 1; i <= n; i++) {
Arrays.fill(map[i], MAX_VALUE);
map[i][i] = 0;
}
for(int i = 0; i < m; i++) {
a = sc.nextInt(); b = sc.nextInt(); c = sc.nextInt();
if(c < map[a][b]) {
map[a][b] = c;
map[b][a] = c;
}
}
floyd();
System.out.println(map[1][n]);
}
}
}