둠치킨
코딩하는 둠치킨
둠치킨

블로그 메뉴

  • 홈
  • 분류 전체보기 (199)
    • BOJ (159)
      • 스택 (14)
      • 큐 (5)
      • 덱 (4)
      • 그래프 (30)
      • 배열 (8)
      • 재귀 (12)
      • 브루트 포스 (2)
      • 그리디 알고리즘 (7)
      • 다이내믹 프로그래밍 (6)
      • 백트래킹 (24)
      • 기하학 (4)
      • 트리 (4)
      • 구현 (14)
      • 수학 (3)
      • 맵 (1)
      • 다익스트라 (2)
    • 자료구조 (14)
      • 스택 (3)
      • 큐 (5)
      • 덱 (2)
      • 그래프 (1)
      • 트리 (1)
      • 힙 (1)
      • 정렬 (1)
    • C++ (5)
      • 모두의코드 (2)
      • Effective C++ (3)
      • C++ 공부 (0)
    • 컴파일러 (1)
    • OS (17)
    • 컴퓨터 구조 (2)
    • Unreal Engine 5 (1)

공지사항

전체 방문자
오늘
어제

인기 글

최근 글

태그

  • BFS
  • boj
  • Bruteforce
  • C
  • C++
  • Cache Memory
  • deadlock
  • DFS
  • Effective C++
  • java
  • Mutex
  • next_permutation
  • os
  • Process
  • rotate
  • semaphore
  • spin lock
  • Thread
  • UE5
  • 경쟁 조건
hELLO · Designed By 정상우.
둠치킨

코딩하는 둠치킨

BOJ/다익스트라

1753번: 최단경로 (BOJ C/C++)

2023. 3. 28. 12:15

1753번: 최단경로

사용 언어: C++

 

풀이

//우선 순위 큐를 이용한 다익스트라 알고리즘으로 최단경로 구하기

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
#define INF 1e9

int v, e, start; //V: 정점의 개수, E: 간선의 개수, start: 시작 정점의 위치

vector<pair<int, int>> arr[20001]; //각 노드가 연결된 노드 정보 저장
//1번째 노드가 3번째 노드에 연결되어있다를 표현하려면 arr[1] <3, 거리>

int dist[20001]; //최단 거리 정보 저장

void dijkstra(int start)
{
	priority_queue<pair<int,int>> pq; //<거리, 인덱스>
	pq.push({0,start});
	dist[start] = 0;

	while(!pq.empty())
	{
		int dist2 = -pq.top().first; //-붙인 이유: 최소 비용 꺼낼때 -붙어있어서 다시 -
		//dist : 현재 노드까지의 거리
		int cur = pq.top().second; //현재 노드
		pq.pop();

		for(int i=0; i<arr[cur].size(); i++)
		{
			int next = arr[cur][i].first; //다음 노드
			int nextdist = arr[cur][i].second; //다음 노드까지의 거리
			int cost  = dist2 + nextdist; //cost: 현재 거리 + 다음 노드까지의 거리

			if(cost < dist[next])
			{
				dist[next] = cost; //더 짧은 거리로 갈 수 있으므로 갱신
				pq.push({-cost, next}); //여기서 -를 붙여야 꺼낼때 최소 비용을 꺼냄
			}
		}
	}
}

int main(void)
{
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> v >> e >> start;

	for(int i=0; i<e; i++)
	{
		int x,y,z;
		cin >> x >> y >> z; //x번 노드에서 y번 노드로 가는 비용이 z
		arr[x].push_back({y,z});
	}

	fill(dist, dist + 20001, INF);

	dijkstra(start);

	for(int i=1; i<=v; i++)
	{
		if(dist[i] == INF)
			cout << "INF" << '\n';
		else
			cout << dist[i] << '\n';
	}

	return 0;
}
저작자표시 (새창열림)

'BOJ > 다익스트라' 카테고리의 다른 글

1504번: 특정한 최단 경로 (BOJ C/C++)  (0) 2023.03.29
    'BOJ/다익스트라' 카테고리의 다른 글
    • 1504번: 특정한 최단 경로 (BOJ C/C++)
    둠치킨
    둠치킨
    코딩 공부를 위한 코딩 블로그 기록 일기

    티스토리툴바