【发布时间】:2016-11-03 14:29:45
【问题描述】:
我们需要计算 minCost(),它有以下参数:
- gNodes - 图 g 中的节点数。
- int 数组,gFrom,其中每个 gfrom[i] 表示由图 g 中的 ith 边连接的节点。
- int 数组,gTo,其中每个 gTo[i] 表示由图 g 中的 ith 边连接的节点。
- int 数组,gWeight,表示图 g 中每条边的相应权重。
- 一个int,start,表示起始节点索引。
- 一个int,end,表示结束节点索引。
- 整数,wExtra,表示可选额外边的权重。
我们需要找到从头到尾具有最小可能权重的路径。我们最多可以在任何两个尚未通过边连接的不同节点之间添加一个具有wExtra权重的额外边(即零或一)。该函数必须返回一个表示从开始到结束的最小路径权重的 int。
我能够提出以下代码(Dijkstra 算法),但它没有给出预期的输出。
public static int minCost(int gNodes, int[] gFrom, int[] gTo, int[] gWeights, int start, int end) {
//making a array to store shortest length and filling it with infinity except the first one
int[] shortest = new int[gNodes];
for (int i = 0; i < gNodes; i++) {
shortest[i] = Integer.MAX_VALUE;
}
shortest[start]=0;
//filling the Queue with all vertices
Queue<Integer> theQ = new PriorityQueue<>();
for (int i = 0; i < gNodes; i++) {
theQ.add(i + 1);
}
//following the algorithm
while (!theQ.isEmpty()) {
int u = theQ.poll();
//making a list of adjacent vertices
List<Integer> adjacent = new ArrayList<>();
for (int i = 0; i < gFrom.length; i++) {
if (gFrom[i] == u) {
adjacent.add(gTo[i]);
} else if (gTo[i] == u) {
adjacent.add(gFrom[i]);
}
}
for (int v: adjacent) {
int weight=0;
for (int i = 0; i < gFrom.length; i++) {
if ((gFrom[i] == u && gTo[i] == v) || (gFrom[i] == v && gTo[i] == u)) {
weight = gWeights[i];
}
}
//relaxing the verices
if (shortest[v] > shortest[u] + weight) {
shortest[v] = shortest[u] + weight;
}
if (v == end) {
return shortest[v];
}
theQ.add(v);
}
}
return -1;
}
public static void main(String[] args) {
int gNodes = 4;
int[] gFrom = {1, 2, 2, 3};
int[] gTo = {2, 3, 4, 4};
int[] gWeights = {2, 1, 2, 3};
int start =1;
int end = 4;
System.out.println(shortestDistance(gNodes, gFrom, gTo, gWeights, start, end));
}
}
它没有给出我认为的预期输出,因为我想不出如何使用那个 wExtra。此外,代码非常混乱。请让我知道出了什么问题,或者随时提供任何可以很好地执行此操作的健壮代码。谢谢。
【问题讨论】:
标签: java algorithm graph shortest-path dijkstra