홍시홍의 프로그래밍

[백준 1753]최단 경로 본문

알고리즘 문제풀이/백준

[백준 1753]최단 경로

홍시홍 2020. 1. 9. 22:42

https://www.acmicpc.net/problem/1753

 

1753번: 최단경로

첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1≤V≤20,000, 1≤E≤300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1≤K≤V)가 주어진다. 셋째 줄부터 E개의 줄에 걸쳐 각 간선을 나타내는 세 개의 정수 (u, v, w)가 순서대로 주어진다. 이는 u에서 v로 가는 가중치 w인 간선이 존재한다는 뜻이다. u와 v는 서로 다르며 w는 10 이하의 자연수이다. 서로 다른 두

www.acmicpc.net

 

요구사항

1. 각 정점까지의 최소거리

 

풀이

1. 다익스트라 기본 문제

 

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

struct go {
    int x;
    int y;
};
int dist[300001];
int n,m;
int startnode;
vector<go> v[20001];
int main(){
    cin>>n>>m;
    cin>>startnode;
    for(int i=0 ; i < m ; i++){
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        v[x].push_back({y,z});
    }
    priority_queue<pair<int,int>> q;
    q.push({0,startnode});
    for(int i=1; i<=n ; i++){
        dist[i]=987654321;
    }
    dist[startnode]=0;

    while(!q.empty()){
        int cost = -q.top().first;
        int node = q.top().second;
        q.pop();
        for(int i=0 ; i <v[node].size();i++){
            int next=v[node][i].x;
            int c = cost +v[node][i].y;
            if(dist[next]>c){
                dist[next]=c;
                q.push({-c,next});
            }
        }
    }

    for(int i=1; i<=n ; i++)
    {
        if(dist[i]==987654321){
            printf("INF\n");
        }
        else{
            printf("%d\n",dist[i]);
        }
        
    }

}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 1194] 달이 차오른다, 가자  (0) 2020.01.09
[백준 1916] 최소비용 구하기  (0) 2020.01.09
[백준 10825] 국영수  (0) 2020.01.09
[백준 1937] 욕심쟁이 판다  (0) 2020.01.09
[백준 11004] k번째 수  (0) 2020.01.09
Comments