邻接矩阵java代码,java-使用邻接矩阵的Dijkstra算法发行

正在尝试检索第一个节点与最后一个节点之间的最短路径.问题是我的代码总是返回0.我有一种感觉,这是因为它正在计算第一个节点与第一个节点之间的距离,该距离将为零,但我不是100%.为什么我的代码总是返回0?

adj矩阵是[10] [10],所有节点都已连接,而g.network [] []是矩阵.

private static int dijkstras(Graph g) {

// Dijkstra's Algorithm

int[] best = new int[g.network.length];

boolean[] visited = new boolean[g.network.length];

int max = 10000; // Infinity equivalent.

for (int i = 0; i < g.network.length; i++)

{

best[i] = max;

visited[i] = false;

}

best[0] = 0;

for(int i = 0; i < g.network.length; i++)

{

int min = max;

int currentNode = 0;

for (int j = 0; j < g.network.length; j++)

{

if (!visited[j] && best[j] < min)

{

currentNode = j;

min = best[j];

}

}

visited[currentNode] = true;

for (int j = 0; j < g.network.length; j++)

{

if (g.network[currentNode][j] < max && best[currentNode] + g.network[currentNode][j] < best[j])

{

best[j] = best[currentNode] + g.network[currentNode][j];

}

}

}

return best[g.network.length - 2];

}

最佳答案

我认为我可以通过如下修改代码来解决问题(我现在传入一个起点,而不是硬编码为“ 0”):

private static int dijkstras(Graph g, int start) // Added a start point.

{

// Dijkstra's Algorithm

int[] best = new int[g.network.length];

boolean[] visited = new boolean[g.network.length];

int max = 10000; // Infinity equivalent.

for (int i = 0; i < g.network.length; i++)

{

best[i] = max;

visited[i] = false;

}

best[start] = start; // Changed the 0 to variable start.

for(int i = 0; i < g.network.length; i++)

{

int min = max;

int currentNode = 0;

for (int j = 0; j < g.network.length; j++)

{

if (!visited[j] && best[j] < min)

{

currentNode = j;

min = best[j];

}

}

visited[currentNode] = true;

for (int j = 0; j < g.network.length; j++)

{

if (g.network[currentNode][j] < max && best[currentNode] + g.network[currentNode][j] < best[j])

{

best[j] = best[currentNode] + g.network[currentNode][j];

}

}

}

return best[g.network.length - 2];

}

我通过for循环运行此代码,瞧……现在不只是返回零.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值