[ ALGORITHM ]/[ 백 준 ]

[BAEKJOON] 10217번 : KCM Travel*

HiStar__ 2020. 9. 15. 00:40

문 제

 

소 스  코 드

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>


constexpr int START	{ 0 };
constexpr int INF	{ 1'000'654'321 };

// 비용과 소요시간
struct Airplane {
	int mNext;
	int mCost;
	int mTime;
};

std::vector<std::vector<Airplane>> mEdge;
int mDist[101][10001];


void TravelKCM();
void Dijkstra(const int&, const int&);


int main() {
	std::ios_base::sync_with_stdio(false);
	std::cin.tie(NULL);
	std::cout.tie(NULL);

	int T;
	std::cin >> T;

	for (int i = 0; i < T; ++i) TravelKCM();

	return 0;
}

void TravelKCM() {

	mEdge.clear();

	int N, M, K;
	std::cin >> N >> M >> K;

	mEdge.resize(N + 1);

	int u, v, c, d;
	for (int i = 0; i < K; ++i) {
		std::cin >> u >> v >> c >> d;
		mEdge[u].emplace_back(Airplane{ v, c, d });
	}
	
	Dijkstra(N, M);
}

void Dijkstra(const int& N, const int& M) {

	for (int i = 0; i <= N; ++i) std::fill_n(mDist[i], M + 1, INF);

	
	mDist[1][0] = 0;
	std::priority_queue<std::pair<int, std::pair<int, int>>> pQue;
	pQue.push({ 0, { 0, 1 } });	// cost, time, pos

	while (!pQue.empty()) {
		int h			{ pQue.top().second.second };
		int hTime		{ pQue.top().second.first };	// 우선순위 큐는 오름차순
		int hCost		{ -pQue.top().first };

		pQue.pop();

		if (mDist[h][hCost] < hTime) continue;

		for (const auto& a : mEdge[h]) {
			int n		{ a.mNext };
			int nCost	{ a.mCost + hCost };
			int nTime	{ a.mTime + hTime };

			if (nCost > M) continue;

			if (mDist[n][nCost] > nTime) {
				for (int i = nCost; i <= M; ++i) {
					if (mDist[n][i] > nTime) mDist[n][i] = nTime;
				}
				pQue.push({ -nCost, {nTime, n} });
			}
		}

	}

	int ret{ INF };
	for (int i = 0; i <= M; ++i) ret = std::min(ret, mDist[N][i]);

	if (INF == ret)		std::cout << "Poor KCM\n";
	else				std::cout << ret << '\n';
}

 

풀 이

 

더보기

다익스트라 알고리즘 + 다이나믹 플밍을 응용하여 풀 수 있는 문제이다.

다익스트라 알고리즘의 경우에는 하나의 거리 정보만 가지고 문제를 해결하지만,

이 문제는 거리와 제한적인 비용을 통하여 구현을 해야하는 문제이다.

 

출 력 값

 

 

문 제  출 처

문제 링크 : www.acmicpc.net/problem/10217

 

10217번: KCM Travel

각고의 노력 끝에 찬민이는 2014 Google Code Jam World Finals에 진출하게 되었다. 구글에서 온 초대장을 받고 기뻐했던 것도 잠시, 찬찬히 읽어보던 찬민이는 중요한 사실을 알아차렸다. 최근의 대세��

www.acmicpc.net

 

'[ ALGORITHM ] > [ 백 준 ]' 카테고리의 다른 글

[BAEKJOON] 11723번 : 집 합  (0) 2020.09.16
[BAEKJOON] 1956번 : 운 동  (0) 2020.09.15
[BAEKJOON] 11404번 : 플로이드  (0) 2020.09.11
[BAEKJOON] 11657번 : 타임머신  (0) 2020.09.10
[BAEKJOON] 9370번 : 미확인 도착지  (0) 2020.09.09