//笛基斯特拉
public static int Dijkstra(int[][] matrix,int m, int v0,int v1) {
int MAXINT = 9999;
int MAXNUM = m+1;
int dist[] = new int[MAXNUM]; //距离
int prev[] = new int[MAXNUM]; //前趋节点
boolean S[] = new boolean[MAXNUM]; // 判断是否已存入该点到S集合中
int n = m;
//初始化
for (int i = 0; i <= n; ++i) {
dist[i] = matrix[v0][i];
S[i] = false; // 初始都未用过该点
if (dist[i] == MAXINT)
prev[i] = -1;
else
prev[i] = v0;
}
//从第v0点开始
dist[v0] = 0;
S[v0] = true;
for (int i = 1; i <= n; i++) {
int mindist = MAXINT;
int u = v0;
// 找出当前未使用的点j的dist[j]最小值
for (int j = 0; j <= n; ++j) {
if ((!S[j]) && dist[j] < mindist) {
u = j; // u保存当前邻接点中距离最小的点的号码
mindist = dist[j];
}
S[u] = true;
}
//更新各节点的距离
for (int j = 0; j <= n; j++) {
if ((!S[j]) && matrix[u][j] < MAXINT) {
if (dist[u] + matrix[u][j] < dist[j]) { //在通过新加入的u点路径找到离v0点更短的路径
dist[j] = dist[u] + matrix[u][j]; //更新dist
prev[j] = u; //记录前驱顶点
}
}
}
}
for (int j = 0; j <= n; j++) {
System.out.print(dist[j]+",");
System.out.print(prev[j]+",");
}
System.out.println();
return dist[v1];
}
//动态规划,floyd算法
public static int dynam(int[][] matrix,int m, int v0,int v1) {
int path[][] = new int[m+1][m+1];
int A[][] = new int[m+1][m+1];
int i,j,k;
for(i =0;i<=m;i++){
for(j = 0;j<=m;j++){
A[i][j] = matrix[i][j];
path[i][j] = i;
}
}
for(k=0;k<=m;k++){
for(i=0;i<=m;i++){
for(j=0;j<=m;j++){
if(A[i][j]>A[i][k]+A[k][j]){
A[i][j] = A[i][k]+A[k][j];
path[i][j] = k;
}
}
}
}
return A[v0][v1];
}
图的最短路径(dijkstra算法/floyd算法)
最新推荐文章于 2022-12-11 22:53:36 发布