어흥

[백준 1916] 최소비용 구하기 (C++) 본문

알고리즘/백준

[백준 1916] 최소비용 구하기 (C++)

라이언납시오 2020. 3. 30. 21:19
728x90
반응형

문제 링크: https://www.acmicpc.net/problem/1916

 

1916번: 최소비용 구하기

첫째 줄에 도시의 개수 N(1 ≤ N ≤ 1,000)이 주어지고 둘째 줄에는 버스의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 M+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가 주어진다. 그리고 그 다음에는 도착지의 도시 번호가 주어지고 또 그 버스 비용이 주어진다. 버스 비용은 0보다 크거나 같고, 100,000보다 작은 정수이다. 그리고 M+3째 줄에는 우리가 구하고자 하는 구간

www.acmicpc.net

1. 주의할 점

- 다익스트라를 통해 구현가능하다.

- 우선순위큐를 사용하여 이미 현 위치의 Node에서 출발한 적이 있는 경우, 이후에 같은 Node에서 출발하려는 값들은 무시한다.

- Dist 배열을 통해 출발점 -> 다른 Node들까지의 최소거리를 구한다

 

2. 구현

- 가중치의 값이 작은것이 우선순위큐의 Top에 오도록 Cmp를 설정한다

- Node +1만큼의 리스트를 만든다

- 다음 Node로 이동하려고 할때, 지금까지 자신이 이동한 거리 + 다음 Node까지의 거리가 이미 Dist배열에 저장된 값보다 작은 경우 다음 Node로 갈 수 있도록 설정한다

 

#define MAX 987654321
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
struct info {
	int idx, val;
};
struct cmp {
	bool operator()(info &a, info &b) {
		return a.val > b.val;
	}
};
info tmp;
vector<info> v[1001];
int dist[1001];
bool visit[1001] = { false, };
int main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	int node, edge, s, e, val, start, dest;
	cin >> node >> edge;
	for (int i = 0; i < edge; i++) {
		cin >> s >> e >> val;
		tmp.idx = e;
		tmp.val = val;
		v[s].push_back(tmp);
	}
	cin >> start >> dest;
	for (int i = 1; i <= node; i++)
		dist[i] = MAX;
	priority_queue<info, vector<info>, cmp> pq;
	tmp.idx = start;
	tmp.val = 0;
	pq.push(tmp);
	long long result;

	while (!pq.empty()) {
		int cidx = pq.top().idx;
		int cv = pq.top().val;
		pq.pop();
		if (cidx == dest) {
			result = cv;
			break;
		}
		if (visit[cidx]) continue;
		visit[cidx] = true;
		for (int i = 0; i < v[cidx].size(); i++) {
			int next = v[cidx][i].idx;
			int nv = v[cidx][i].val;
			if (dist[next] > cv + nv) {
				dist[next] = cv + nv;
				tmp.idx = next;
				tmp.val = cv + nv;
				pq.push(tmp);
			}
		}
	}
	cout << result;
	system("pause");
	return 0;
}
728x90
반응형
Comments