참고로 그래프 알고리즘 중 최소 비용을 구하는 데는 다익스트라 알고리즘 외에도 벨만-포드 알고리즘, 프로이드 워샬 알고리즘 등이 있다.
(출처: https://velog.io/@717lumos/알고리즘-다익스트라Dijkstra-알고리즘)
이해하는데 시간이 걸렸고, 아직까지도 명확하게 잡히지 않는다. 내가 이해하고 있는게 정확히 맞는지도 잘 모르겠다.
그래도 현재 이해하고 있는대로 적어보자면,
결국 최소 비용으로 어느 지점에 도달하기 위해서는 현재 상태에서 선택할 수 있는 방향중 가장 최소 비용인 길을 선택하는 것이 효율적이다.
따라서 priority_queue 를 이용해 현재 노드에서 갈 수 있는 노드들중 최소 비용인 곳을 선택하고
현재노드까지 비용 + 다음 노드로 가는 비용 vs 이미 파악된 다음 노드로 가는 비용을 비교해서 더 작은 값으로 최신화 한다.
결국 계속 최소비용을 비교해가면서 탐색을 진행하는 개념이고, 그 과정에서 priority_queue가 이용되는데, 솔직히 처음에 그냥 queue로 풀었을 때도 답이 나와서 명확히 무슨 차이인지 잘 이해가 안간다...
int main(){
freopen("input.txt","rt",stdin);
int n, m, a, b, c;
cin>>n>>m;
vector<int> dst(21,2147000000);
vector<vector<Data>> city(21);
priority_queue<Data> pQ;
for(int i=0; i<m; i++){
cin>>a>>b>>c;
city[a].push_back(Data(b,c));
}
pQ.push(Data(1,0));
dst[1] = 0;
while(!pQ.empty()){
int x = pQ.top().n;
pQ.pop();
for(int i=0; i<city[x].size(); i++){
int ct = dst[x] + city[x][i].cost;
if(ct< dst[city[x][i].n]){
dst[city[x][i].n] = ct;
pQ.push(city[x][i]);
}
}
}
for(int i=2; i<=n; i++){
cout<<i<<" : ";
if(dst[i]==2147000000)
cout<<"impossible"<<endl;
else
cout<<dst[i]<<endl;
}
return 0;
}
다음에 다시 한 번 보고 이해해보기로
빈씨, 다익스타라와 일반 BFS 의 차이점은 문제를 많이 풀어봐야 알 수 있는 차이라는 것을 알려주고싶네. 최소 경로, 최소 비용을 구하는 문제에는 차이점이 있고 만약 이동하는 경로가 가중치가 있는 조건이라면 다익스트라 알고리즘을 쓰는게 맞음.
근데 그게 아니라면은 일반적인 BFS로도 답을 구할수있지만 그래프가 어떻게 연결되있냐에 따라, 혹은 2중 벡터로 이루어진 매트릭스에서 이동하는 경로에 따라 값을 지불해야 하거나 등등 조건에 따라서 다익스트라는 가장 많이 쓰이는 알고리즘중 하나니깐 잘 외워봐!
Cheapest Flights Within K Stops
https://leetcode.com/problems/cheapest-flights-within-k-stops/
이 문제도 정말 대표적인 다익스트라 문제인데 한번 도전해봐!