Computer >> 컴퓨터 >  >> 프로그램 작성 >> 프로그램 작성

단일 소스 최단 경로, 음이 아닌 가중치

<시간/>

단일 소스 최단 경로 알고리즘(음수가 아닌 가중치)은 Dijkstra 알고리즘으로도 알려져 있습니다. 인접 행렬 표현이 있는 주어진 그래프 G(V,E)가 있으며 소스 정점도 제공됩니다. 그래프 G의 다른 정점에 대한 소스 정점 사이의 최소 최단 경로를 찾는 Dijkstra의 알고리즘입니다.

단일 소스 최단 경로, 음이 아닌 가중치

시작 노드에서 다른 노드까지 가장 작은 거리를 찾습니다. 이 문제에서 그래프는 인접 행렬을 사용하여 표현됩니다. (비용 매트릭스와 인접 매트릭스는 이를 위해 유사합니다.)

입력 − 인접 행렬 −

0 3 6 ∞ ∞ ∞ ∞
3 0 2 1 ∞ ∞ ∞
6 2 0 1 4 2 ∞
∞ 1 1 0 2 ∞ 4
∞ ∞ 4 2 0 2 1
∞ ∞ 2 ∞ 2 0 1
∞ ∞ ∞ 4 1 1 0

출력 -

0 to 1, Using: 0, Cost: 3

0 to 2, Using: 1, Cost: 5

0 to 3, Using: 1, Cost: 4

0 to 4, Using: 3, Cost: 6

0 to 5, Using: 2, Cost: 7

0 to 6, Using: 4, Cost: 7

알고리즘

dijkstraShortestPath(n, dist, 다음, 시작)

입력 − 총 노드 수 n, 각 정점에 대한 거리 목록, 다음에 올 노드를 저장할 다음 목록, 시드 또는 시작 정점.

출력 − 시작에서 다른 모든 정점까지의 최단 경로.

Begin
   create a status list to hold the current status of the selected node
   for all vertices u in V do
      status[u] := unconsidered
      dist[u] := distance from source using cost matrix
      next[u] := start
   done
   status[start] := considered, dist[start] := 0 and next[start] := φ
   while take unconsidered vertex u as distance is minimum do
      status[u] := considered
      for all vertex v in V do
         if status[v] = unconsidered then
         if dist[v] > dist[u] + cost[u,v] then
            dist[v] := dist[u] + cost[u,v]
            next[v] := u
      done
   done
End

예시(C++)

#include<iostream>
#define V 7
#define INF 999
using namespace std;
//Cost matrix of the graph
int costMat[V][V] = {
   {0, 3, 6, INF, INF, INF, INF},
   {3, 0, 2, 1, INF, INF, INF},
   {6, 2, 0, 1, 4, 2, INF},
   {INF, 1, 1, 0, 2, INF, 4},
   {INF, INF, 4, 2, 0, 2, 1},
   {INF, INF, 2, INF, 2, 0, 1},
   {INF, INF, INF, 4, 1, 1, 0}
};
int minimum(int *status, int *dis, int n){
   int i, min, index;
   min = INF;
   for(i = 0; i<n; i++)
      if(dis[i] < min && status[i] == 1){
      min = dis[i];
      index = i;
   }
   if(status[index] == 1)
      return index;//minimum unconsidered vertex distance
   else
      return -1;//when all vertices considered
}
void dijkstra(int n, int *dist,int *next, int s){
   int status[V];
   int u, v;
   //initialization
   for(u = 0; u<n; u++){
      status[u] = 1;//unconsidered vertex
      dist[u] = costMat[u][s];//distance from source
      next[u] = s;
   }
   //for source vertex
   status[s] = 2; dist[s] = 0; next[s] = -1;//-1 for starting vertex
   while((u = minimum(status, dist, n)) > -1){
      status[u] = 2;//now considered
      for(v = 0; v<n; v++)
         if(status[v] == 1)
            if(dist[v] > dist[u] + costMat[u][v]){
      dist[v] = dist[u] + costMat[u][v];//update distance
      next[v] = u;
      }
   }
}
main(){
   int dis[V], next[V], i, start = 0;
   dijkstra(V, dis, next, start);
   for(i = 0; i<V; i++)
      if(i != start)
         cout << start << " to " << i <<", Using: " << next[i] << ", Cost: " << dis[i] << endl;
}

출력

0 to 1, Using: 0, Cost: 3

0 to 2, Using: 1, Cost: 5

0 to 3, Using: 1, Cost: 4

0 to 4, Using: 3, Cost: 6

0 to 5, Using: 2, Cost: 7

0 to 6, Using: 4, Cost: 7