스쳐가는비
devtravel
스쳐가는비
전체 방문자
오늘
어제
  • 분류 전체보기 (108)
    • 🎵 Daily (0)
    • 📚 Computer Science (11)
      • Algorithm (9)
      • Design Pattern (2)
    • 🔥 Programming (23)
      • C# (3)
      • C++ (5)
      • WPF (0)
      • Python (1)
      • OpenCV (9)
      • ML & DL (5)
    • 🔥 Web (13)
      • HTML (6)
      • JavaScript (7)
    • 📌 Tool (2)
      • Git (2)
      • Etc (0)
    • 📖 Certificate (10)
      • 컴활 1급 (2)
      • SQL 개발자 (2)
      • 리눅스 마스터 (0)
      • 정보처리기사 (0)
      • 사무자동화산업기사 (0)
      • ADsP (6)
    • 💻 OnlineJudge (49)
      • Baekjoon (49)
      • GoormEdu (0)
GitHub Contribution
Loading data ...

인기 글

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
스쳐가는비

devtravel

[백준 / BOJ] C++ 1753 최단경로
💻 OnlineJudge/Baekjoon

[백준 / BOJ] C++ 1753 최단경로

2022. 11. 16. 19:26

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

 

1753번: 최단경로

첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1 ≤ K ≤ V)가

www.acmicpc.net

풀이

다익스트라 문제이다. 

시작노드부터 최단 경로를 찾아내며, 최단경로에 저장되어있는 가중치를 출력한다.

 

우선 아래 이미지는 위의 입력을 그림으로 표현하였다.

우선순위큐를 이용하여 가중치 낮은순으로 저장을 하고, 

해당 노드 방문시 시작지점으로부터 가중치를 더하여 비교를 하였을 때,

작은 경우만 출력을 해주면 된다.

 

Code ( C++ )

#include <iostream>
#include <vector>
#include <queue>
#define INF 1000000
#define NODE_MAX 20001
#define VERTEX_MAX 300001

using namespace std;

int V, E, K;
int minVal[NODE_MAX];

// pair <가중치, 도착노드>
vector<pair<int, int>> vec[VERTEX_MAX];
priority_queue<pair<int, int>> pq;

void Dijkstra(int idx)
{
	int NowIdx = 0;
	int weight = 0;
	// 자기 자신으로 가는 가중치는 없음.
	minVal[idx] = 0;

	pq.push(make_pair(0, idx));

	while (!pq.empty())
	{
		NowIdx = pq.top().second;
		weight = -pq.top().first;

		pq.pop();

		if (minVal[NowIdx] < weight)
			continue;

		for (int i = 0; i < vec[NowIdx].size(); i++)
		{
			int next_node = vec[NowIdx][i].second;
			int total_weight = weight + vec[NowIdx][i].first;

			if (minVal[next_node] > total_weight)
			{
				minVal[next_node] = total_weight;

				pq.push(make_pair(-total_weight, next_node));
			}
		}
	}
}

int main()
{
	// 시작노드, 도착노드, 가중치
	int u, v, w;

	ios::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	cin >> V >> E;
	cin >> K;

	fill(minVal, minVal + V + 1, INF);

	for (int i = 0; i < E; i++)
	{
		cin >> u >> v >> w;

		//시작노트 vec에 도착노드로 가는 가중치를 같이 저장
		vec[u].push_back(make_pair(w, v));
	}

	Dijkstra(K);

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

'💻 OnlineJudge > Baekjoon' 카테고리의 다른 글

[백준 / BOJ] C++ 1932 정수 삼각형  (0) 2022.11.25
[백준 / BOJ] C++ 1918 후위 표기식  (0) 2022.11.24
[백준 / BOJ] C++ 1629 곱셈  (0) 2022.11.10
[백준 / BOJ] C++ 1504 특정한 최단 경로  (0) 2022.11.10
[백준 / BOJ] C++ 1238 파티  (0) 2022.11.10
    '💻 OnlineJudge/Baekjoon' 카테고리의 다른 글
    • [백준 / BOJ] C++ 1932 정수 삼각형
    • [백준 / BOJ] C++ 1918 후위 표기식
    • [백준 / BOJ] C++ 1629 곱셈
    • [백준 / BOJ] C++ 1504 특정한 최단 경로
    스쳐가는비
    스쳐가는비
    The biggest risk is not taking any risk

    티스토리툴바