욕심 전략의 풀이 단일 소스 최 단 경로 - dijkstra 알고리즘
3735 단어 알고리즘
Dijkstra 알고리즘 을 실현 하려 면 prim 알고리즘 과 유사 할 수 있 고 2 개의 집합 s1, s2 를 구성 해 야 합 니 다.그 중에서 s1 은 현재 검색 한 가장 짧 은 경로 의 정점 집합 이 고 s2 는 나머지 풀이 가 있 는 점 집합 입 니 다.검색 할 때마다 s2 의 점 과 마지막 으로 s1 에 추 가 된 점 을 가중치 업데이트 작업 을 합 니 다. s1 에서 s2 까지 의 더 짧 은 경 로 를 발견 하면 현재 거리 집합 을 업데이트 하고 최 단 거리 에 대응 하 는 점 을 s1 에 추가 하여 s2 에서 삭제 합 니 다.
Dijkstra 알고리즘 의 시간 복잡 도 는 O (n ^ 2) 입 니 다.
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
/**
* Dijkstra
* @author ql_math
*
*/
public class DijkstraShortestPath {
/** */
private double[] shortestPathArray;
private int pointsNum;
/**
* Dijkstra
* @param pIndex
* @param graphicArray
* @return
*/
public double[] calculateShortestPath(int pIndex, double[][] graphicArray)
{
SimpleGraphics graph=new SimpleGraphics(graphicArray);
pointsNum=graph.getPSize();//
List<Integer> curFoundList=new LinkedList<Integer>();//
curFoundList.add(pIndex);
List<Integer> midList=new LinkedList<Integer>();//
shortestPathArray=new double[pointsNum];//
initShortestPath(midList,pIndex);//
int set_num=1;
while(set_num<=pointsNum)
{
int cur_shortest_index=calculateP2PShortestPath(graph,curFoundList,midList);//
curFoundList.add(cur_shortest_index);
midList.remove(new Integer(cur_shortest_index));
set_num++;
}
return shortestPathArray;
}
private int calculateP2PShortestPath(SimpleGraphics graph, List<Integer> curFoundList, List<Integer> midList) {
int compareNode=((LinkedList<Integer>)curFoundList).getLast();
double[] array=graph.getAdjacencyPoints(compareNode);
double min=Double.MAX_VALUE;
int index=0;
for(int i=0;i<pointsNum;i++)
{
double newLen=shortestPathArray[compareNode]+array[i];
if(newLen<shortestPathArray[i]&&midList.contains(i))
shortestPathArray[i]=newLen;
}
for(int i=0;i<pointsNum;i++)
{
if(shortestPathArray[i]<min&&midList.contains(i))
{
index=i;
min=shortestPathArray[i];
}
}
return index;
}
/**
*
* @param n
* @param index
*/
private void initShortestPath(List<Integer> list, int index) {
for(int i=0;i<pointsNum;i++)
{
if(i!=index)
{
list.add(i);
shortestPathArray[i]=Double.MAX_VALUE;
}
}
}
/**
* @param args
*/
public static void main(String[] args) {
DijkstraShortestPath dj=new DijkstraShortestPath();
double[][] graphicArray={{0,1,6,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE},
{1,0,3,4,6,Double.MAX_VALUE},{6,3,0,2,2,Double.MAX_VALUE},
{Double.MAX_VALUE,4,2,0,2,3},{Double.MAX_VALUE,6,2,2,0,4},{Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,3,4,0}};
System.out.println(" :"+Arrays.toString(dj.calculateShortestPath(0,graphicArray)));
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Codility Lesson3】FrogJmpA small frog wants to get to the other side of the road. The frog is currently located at position X and wants to get to...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.