티스토리 뷰

알고리즘

80. 다익스트라 알고리즘

홍복치 2021. 2. 22. 21:32

인프런 - it 취업을 위한 알고리즘 문제풀이 (with C/C++) : 코딩테스트 대비 강의를 바탕으로 공부한 내용입니다.

문제는 비공개로 입력예제와 출력예제만을 가지고 포스팅

 

 

풀이 

- 다익스트라 알고리즘

- 거리 배열을 사용

- 현재지점까지의 거리 + 새로운 지점까지의 거리 vs 새로운 지점의 거리배열에 있는 거리 

=> 거리배열에 더 작은 값이 있다면 continue 

=> 아니라면 새로운거리로 배열의 값을 업데이트 하고 큐에 푸시한다.

#include <stdio.h>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;

//80. 다익스트라 알고리즘
struct Edge{
    int vex; //정점
    int dis; //거리
    Edge(int a, int b){
        vex=a;
        dis=b;
    }
    bool operator<(const Edge &b) const{
        return dis>b.dis;
    }
};

int main(){
    vector<pair<int, int> > graph[30];
    priority_queue<Edge> Q;
    int i, n, m, a, b, c;
    scanf("%d %d", &n, &m);
    vector<int> dist(n+1, 2147000000); //거리를 담을 벡터배열
    for(i=1;i<=m;i++){
        scanf("%d %d %d", &a, &b, &c);
        graph[a].push_back(make_pair(b, c));
    }
    Q.push(Edge(1,0));
    dist[1]=0;
    while(!Q.empty()){
        int now=Q.top().vex;
        int cost=Q.top().dis;
        Q.pop();
        if(cost>dist[now]) continue;
        for(i=0;i<graph[now].size();i++){
            int next=graph[now][i].first;
            int nextDis=cost+graph[now][i].second;
            if(dist[next]>nextDis){
                dist[next]=nextDis;
                Q.push(Edge(next, nextDis));
            }
        }
    }
    for(i=2;i<=n;i++){
        if(dist[i]!=2147000000) printf("%d : %d\n", i, dist[i]);
        else printf("%d : impossible\n", i);
    }
    
    return 0;
}

'알고리즘' 카테고리의 다른 글

83. 복면산  (0) 2021.03.02
81. 벨만-포드 알고리즘  (0) 2021.02.25
82. 순열구하기 [DFS]  (0) 2021.02.17
79. 원더랜드 [Prim 알고리즘 이용]  (0) 2021.02.15
78. 원더랜드 [Kruskal MST 알고리즘]  (0) 2021.02.10
최근에 올라온 글
Total
Today
Yesterday