※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 16167번 문제인 A Great Way이다.
문제는 아래 링크를 확인하자.

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

 

16167번: A Great Way

첫 번째 줄에 거점의 수 N과 경로의 개수 R이 주어진다. (2 ≤ N ≤ 100, 1 ≤ R ≤ 200) 모든 거점에는 1부터 N까지 번호가 매겨져 있으며 중앙대학교는 1번, 숭실대학교는 N번이다. 두 번째 줄부터는 R

www.acmicpc.net

주어진 문제의 상황은 가중치와 방향이 있는 간선으로 이루어진 그래프로 모델링할 수 있다.

 

또한 주어진 문제를 해결하는 것은 위와 같이 모델링한 그래프 위에서의 1번 노드에서 N번 노드까지의 최소비용 경로의 그 비용과 해당 경로가 가질 수 있는 가장 적은 노드의 개수를 구하는 문제를 해결하는 것과 같아진다.

 

dijkstra 알고리즘을 이용해 문제를 해결해주자. 이 때 가중치의 기준은 일반적인 dijkstra와 같이 비용으로 하되 두 번째 기준으로 해당 노드까지 (가장 적은 비용으로) 도달하는 데에 필요한 노드의 개수로 삼아 문제를 해결하자.

 

아래는 제출한 소스코드이다.

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

int N, E;
vector<pair<int,int>> G[101]; // {노드, 거리}
pair<int, int> dist[101];

void dijkstra() {
	dist[1] = { 0,1 };
	priority_queue<pair<pair<int, int>,int>> pq; // {{-거리, -노드수},노드}
	pq.push(make_pair(make_pair(0, -1), 1));

	while (!pq.empty()) {
		int d = -pq.top().first.first, cnt = -pq.top().first.second, cur = pq.top().second; pq.pop();
		if (dist[cur] < make_pair(d, cnt)) continue;
		for (auto& p : G[cur]) {
			int nxt = p.first, dd = d + p.second;
			if (dist[nxt] == make_pair(0, 0) || make_pair(dd, cnt + 1) < dist[nxt]) {
				dist[nxt] = make_pair(dd, cnt + 1);
				pq.push(make_pair(make_pair(-dd, -(cnt + 1)), nxt));
			}
		}
	}
}

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

	cin >> N >> E;
	while (E--) {
		int a, b, c, d, e; cin >> a >> b >> c >> d >> e;
		int t;
		if (e < 10) t = c;
		else t = c + d * (e - 10);
		G[a].emplace_back(make_pair(b, t));
	}

	dijkstra();

	if (dist[N] == make_pair(0, 0)) cout << "It is not a great way.";
	else cout << dist[N].first << ' ' << dist[N].second;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 16165 // C++] 걸그룹 마스터 준석이  (0) 2023.08.07
[BOJ 16168 // C++] 퍼레이드  (0) 2023.08.06
[BOJ 28278 // C++] 스택 2  (0) 2023.08.04
[BOJ 16166 // C++] 서울의 지하철  (0) 2023.08.04
[BOJ 25577 // C++] 열 정렬정렬 정  (0) 2023.08.03

+ Recent posts