基本的dijkstra算法
基本的dijkstra算法是求单源点到其余各点的最短路径,下面的dijkstra可以返回两个顶点之间的最短路径。返回数组里储存的是从起始顶点到结束顶点的最短路径经过的点的顺序。
package DijkstraJingxi;
public class Dijkstra{
public void dijkstra(int n, int v, int dist[], int prev[],int[][] c){ int maxint = Integer.MAX_VALUE; // 表示最大整数上限
boolean[] s = new boolean[n]; //记录该点是否被访问过
for(int i = 0; i < n; i++){
dist[i] = c[v][i]; //目的地点初始化
s[i] = false; //记录第i个点是否被访问过,初始化为false;
if(dist[i] == maxint){
prev[i] = 0;
}
else{
prev[i] = v; //起始点
}
}
dist[v] = 0;
s[v] = true; //被访问过
for(int i = 0; i < n+1; i++){
int temp = maxint;
int u = v;
for(int j = 0; j < n; j++){
if((!s[j]) && (dist[j] < temp)){
u = j; //得到最短路径的终点
temp = dist[j];
}
}
s[u] = true;
for(int j = 0; j < n; j++){
if((!s[j]) && (c[u][j] < maxint)){
int newdist = dist[u] + c[u][j];
if (newdist < dist[j]){
dist[j] = newdist; //新的最短路径
prev[j] = u; //最短路径的上一个点
}
}
}
}
}
public int[] shortestPath(Graphm G, int v1, int v2){
int n = G.n();
int q = 0;
int[] way = new int[n];
int[] dist = new int[n];
int[] prev = new int[n];
int[][] c = new int[n][n];
//路径初始化
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
c[i][j] = G.Matrix[i][j][0];
}
}
//调用dijkstra算法,得到最短路
dijkstra(n, v1, dist, prev,c );
//得到路径
int w = v2;
while(w != v1){
q++;
way[q] = prev[w];
w = prev[w];
}
//得到正确顺序的路径
int[] ret = new int[q + 1];
int i, j;
for(i = 0, j = q ; j >= 1; i++, j--){ ret[i] = way[j];
}
//路径的终点
ret[i] = v2;
return ret;
}
}
package a;
import java.util.*;
//节点
class Node
{
int name;
Node fathernode;
}
//路径
class Route
{
int a;
int b;
double length;
public Route(int x,int y,double len)
{
a=x;b=y;length=len;
}
}
class Rsinfo
{
int name;
double length;
}
//结果
class Result
{
ArrayList
double length;
}
//
public class ShortCut {
ArrayList
ArrayList
double[][] la,lb,w;
int[] seq;
int N;
int sN;
int r=0;
//nlist 表示节点的列表,
public void init(ArrayList
N = nlist.size();
la=new double[N][ ];
lb=new double[N][ ];
w=new double[N][ ];
seq=new int[N];
plist=new ArrayList
vlist=new ArrayList
//----------------------------------
for(int i=0;i { la[i]=new double[N]; lb[i]=new double[N]; w[i]=new double[N]; } //---------------------------------- for(int i=0;i { seq[i]=nlist.get(i); } //------------------------------------ for(int i=0;i { for(int j=0;j { la[i][j]=1000000; lb[i][j]=1000000; w[i][j]=1000000; } } } public void addNode(ArrayList Route rt; int x,y; int len=ndlist.size(); for(int i=0;i { rt=ndlist.get(i); x=this.getChgNum(rt.a); y=this.getChgNum(rt.b); w[x][y]=rt.length; w[y][x]=rt.length; } } //获得经过转换后的数字 public int getChgNum(int n) { for(int i=0;i { if(seq[i]==n)return i; } return 0; } //获得原来的数字 public int getOrgNum(int n) { return seq[n]; } public void getShortCut(Result rs,int root) { int flag=0; flag=this.getChgNum(root); //初始化标号集合 rs.rlist=new ArrayList for(int i=0;i { if(i==flag) { flag=i; vlist.add(i); lb[0][flag]= 0; continue; } plist.add(i); } for(int i=0;i { la[0][i] = w[flag][i] ; System.out.println("0 "+ i+" "+w[flag][i]); } r=1; //求出最短路径 while(true) { Rs2 r2=new Rs2(); this.Minla(r2); this.show(la); this.show(plist); lb[r][r2.i]=r2.min; this.Remove(r2.i); this.add(rs, r2.i,r2.min); if(plist.size()==0)break; this.Minlb( r2.i); } } public void Remove(int n) { for(int i=0;i { if(plist.get(i)==n){plist.remove(i);return;} } } public void add(Result rt,int n,double length) { vlist.add(n); Rsinfo rs=new Rsinfo(); https://www.360docs.net/doc/7c18441681.html,=this.getOrgNum(n); rs.length=length; rt.rlist.add(rs); } public void Minla(Rs2 rs) { double min=10000000; int flag=0; for(int i=0;i { if(this.InP(i)) { if(la[r-1][i]<=min) { min=la[r-1][i]; flag=i; } } } rs.i=flag; rs.min=min; } public void Minlb(int n) { double min=10000000; int flag=0; double sum=0; for(int i=0;i { if(this.InP(i)) { sum=lb[r][n]+w[n][i]; if(la[r-1][i] else min=sum; la[r][i]=min; } } r++; } //查看是否在P集合中 public boolean InP(int n) { int len=plist.size(); for(int i=0;i { if(n==plist.get(i))return true; } return false; } public void show(double[][] t) { for(int i=0;i { for(int j=0;j { System.out.print(t[i][j]+" "); } System.out.println(""); } System.out.println("****************************"); } public void show(ArrayList { System.out.println("###"); for(int i=0;i System.out.print(" " +list.get(i)); System.out.println(""); } } //返回两个数字 class Rs2 { int i; double min; }