그래프 알고리즘에서 최소 비용을 구하는 문제에서 사용하는 대표적인 알고리즘이다. 두 노드 사이의 비용을 구하는 문제에 유용하게 사용된다.
비용이 적은 정점을 방문한 노드로 체크하고 그 노드에 대한 비용을 수정하지 않게 되는데 이는 모든 비용이 양수라는 가정 하에 이뤄지는 것이다. 즉, 모든 비용이 양수일 때만 다익스트라 알고리즘을 적용시킬 수 있다.
int Find_Shortest_Node()
{
int Min_Dist, Min_Idx;
Min_Dist = INF;
Min_Idx = -1;
for (int i = 1; i <= V; i++)
{
if (Select[i] == true) continue;
if (Dist[i] < Min_Dist)
{
Min_Dist = Dist[i];
Min_Idx = i;
}
}
return Min_Idx;
}
void Update_Dist(int NewNode)
{
for (int i = 1; i <= V; i++)
{
if (Select[i] == true) continue;
if (Dist[i] > Dist[NewNode] + MAP[NewNode][i])
{
Dist[i] = Dist[NewNode] + MAP[NewNode][i];
}
}
}
void Dijkstra()
{
for (int i = 1; i <= V; i++) Dist[i] = MAP[Start][i];
Dist[Start] = 0;
Select[Start] = true;
for (int i = 0; i < V - 1; i++)
{
int NewNode = Find_Shortest_Node();
Select[NewNode] = true;
Update_Dist(NewNode);
}
}
void Dijkstra_Using_Heap()
{
priority_queue<pair<int, int>> PQ;
PQ.push(make_pair(0, Start));
Dist[Start] = 0;
while (PQ.empty() == 0)
{
int Cost = -PQ.top().first;
int Cur = PQ.top().second;
PQ.pop();
for (int i = 0; i < Vertex[Cur].size(); i++)
{
int Next = Vertex[Cur][i].first;
int nCost = Vertex[Cur][i].second;
if (Dist[Next] > Cost + nCost)
{
Dist[Next] = Cost + nCost;
PQ.push(make_pair(-Dist[Next], Next));
}
}
}
for (int i = 1; i <= V; i++)
{
if (Dist[i] == INF) cout << "INF" << endl;
else cout << Dist[i] << endl;
}
}