우리 파라미터 follwing을 한 minCost()을 계산할 필요가 없다 :주어진 매개 변수를 사용하여 Graph에서 두 정점 간의 최단 경로를 계산하는 방법은 무엇입니까?
- gNodes - 노드의 어떠한 그래프 g이다.
- int의 배열 gFrom 여기서 gfrom [i]는 그래프 g에서 ith 에지로 연결된 노드를 나타냅니다.
- int의 배열 gTo 여기서 gTo [i]는 그래프 g에서 ith edge로 연결된 노드를 나타냅니다.
- g의 각 에지의 각 가중치를 나타내는 int 배열이 gWeight입니다.
- int 시작 시작 노드 색인을 나타냅니다.
- int, 끝, 끝 노드 인덱스를 나타냅니다.
- 정수, wExtra, 선택적 여분 가장자리의 무게를 나타냅니다.
최소 가능한 무게를 가진 경로를 처음부터 끝까지 찾아야합니다. wExtra 무게 사이에 최대 하나의 여분의 가장자리 (즉, 0 또는 1)를 추가 할 수 있습니다. 가장자리에이 아직 연결되어 있지 않은 두 개의 별개 노드가 사이에 추가 될 수 있습니다. 이 함수는 처음부터 끝까지 최소 경로 가중치를 나타내는 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을 사용하는 방법을 생각할 수 없기 때문에 생각 예상 출력을 포기하지 않을거야. 또한이 코드는 상당히 엉망입니다. 무엇이 잘못 되었는 지 알려주거나 잘 수행 할 수있는 강력한 코드를 제공하십시오. 감사.
그래프 중복, 당신은 모든 입력 노드에 대해 두 개의 노드가되도록 : wExtra
를 통합하는
니코, 같은 코드를 제공 할 수 있습니까? –
아니요,이 모든 것을 올바르게하는 데는 꽤 시간이 걸립니다. 나는 당신이 그것을 알아낼 수있을 것이라고 확신합니다. –