您的位置:首页 > 编程语言 > Java开发

Dijkstra和floyd——求单源点最短路径

2013-10-11 10:14 776 查看
虽然是跟着学的,但实在米有改动。。。因为这两个算法的确就这样写的啦~~~

所以直接把代码跟着敲一敲运行一遍放上来~~~
package com.java.struture;
import java.util.Scanner;
public class MinPath {
private static int INF = 999999;
private int[][]map;
private int n;
private int []dist;
private boolean []visited;
public MinPath(int n, int [][]map){
this.n = n;
this.map = map;
this.dist = new int[n+1];
}
private void floyd(){
for(int k = 1; k <= n;k++){//k为中间点
for(int i = 1; i<=n; i++){
for(int j = 1; j<=n;j++){
if(map[i][k]+map[k][j] < map[i][j])
map[i][j] = map[i][k]+map[k][j];
}
}
}
System.out.println(map[1]
);
}
private void dijk(){
int x=0,MIN = 0;
visited = new boolean[n+1];
//初始化距离为INF最大值
for(int i = 1; i<=n ;i++){
dist[i] = INF;
}
dist[1] = 0;//1为最开始的点
for(int i = 1; i<=n ;i++){
MIN = INF;
for(int j = 1; j<=n ;j++){
if(!visited[j] && dist[j]<MIN){
MIN = dist[j];//找到比当前距离小的就替换MIN
x = j;//记录最小点的下标,从这点出发开始往下搜
}
}
if(MIN == INF)break;//没有改变
visited[x]=true;
//对于从x出发的所有边(x,j),更新距离d[j]
for(int j = 1 ; j<= n; j++){
if(!visited[j] && dist[j] > dist[x]+map[x][j])
dist[j] = dist[x] + map[x][j];
}
}
System.out.println(dist
);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int n = sc.nextInt();//顶点数
int m = sc.nextInt();//边数
if(n==0 && m==0)break;
int[][]map = new int[n+1][n+1];
for(int i = 1; i <= n;i++){
for(int j = 1; j <=n ;j++){
if(i==j)
map[i][j] = 0;
else
map[i][j] = map[j][i] = INF;
}
}
int vi, vj , cost;
while(m-- > 0){
vi = sc.nextInt();
vj = sc.nextInt();
cost = sc.nextInt();
if(cost < map[vi][vj])
map[vi][vj] = map[vj][vi] = cost;
}
MinPath mp = new MinPath(n,map);
//mp.dijk();
mp.floyd();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 最短路径 dijkstra