BOJ/그래프 이론

[C/C++] 백준 - 14284번 : 간선 이어가기2 (다익스트라)

JWonK 2023. 2. 8. 17:11
728x90
반응형

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

 

14284번: 간선 이어가기 2

정점 n개, 0개의 간선으로 이루어진 무방향 그래프가 주어진다. 그리고 m개의 가중치 간선의 정보가 있는 간선리스트가 주어진다. 간선리스트에 있는 간선 하나씩 그래프에 추가해 나갈 것이다.

www.acmicpc.net

문제

정점 n개, 0개의 간선으로 이루어진 무방향 그래프가 주어진다. 그리고 m개의 가중치 간선의 정보가 있는 간선리스트가 주어진다. 간선리스트에 있는 간선 하나씩 그래프에 추가해 나갈 것이다. 이때, 특정 정점 s와 t가 연결이 되는 시점에서 간선 추가를 멈출 것이다. 연결이란 두 정점이 간선을 통해 방문 가능한 것을 말한다.

s와 t가 연결이 되는 시점의 간선의 가중치의 합이 최소가 되게 추가하는 간선의 순서를 조정할 때, 그 최솟값을 구하시오.

입력

첫째 줄에 정점의 개수 n, 간선리스트의 간선 수 m이 주어진다.(2≤n≤5000,1≤m≤100,000)

다음 m줄에는 a,b,c가 주어지는데, 이는 a와 b는 c의 가중치를 가짐을 말한다. (1≤a,b≤n,1≤c≤100,a≠b)

다음 줄에는 두 정점 s,t가 주어진다. (1≤s,t≤n,s≠t)

모든 간선을 연결하면 그래프는 연결 그래프가 됨이 보장된다.

출력

s와 t가 연결되는 시점의 간선의 가중치 합의 최솟값을 출력하시오,


문제 이해가 조금 이상했던 문제이다. 마지막 문장에서 간선의 순서를 조정한다고 하여 그냥 특정 정점 s - t 사이의 최단 경로를 구하면 되는 문제이다. 즉, 다익스트라 알고리즘으로 해결하면 되는 간단한 문제이다. 

 

특정 정점 사이 최단 거리를 구하는 다익스트라 알고리즘에 대한 설명은 아래 블로그에서 매우 매우 잘 해놓으셔서 참고하면 좋을 듯 하다.

https://m.blog.naver.com/ndb796/221234424646

 

23. 다익스트라(Dijkstra) 알고리즘

  다익스트라(Dijkstra) 알고리즘은 다이나믹 프로그래밍을 활용한 대표적인 최단 경로(Shortest P...

blog.naver.com

 

#include <bits/stdc++.h>
#define fastio ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define INF 1e9+3
#define endl '\n'

using namespace std;

typedef long long ll;
typedef unsigned long long ull;

struct compare{
	bool operator()(pair<int, int> &lhs, pair<int, int> &rhs){
		return lhs.first > rhs.first;
	}
};

int N, M, s, t;
int distances[5000 + 1];
vector<pair<int, int>> adj[5000 + 1];
priority_queue<pair<int, int>, vector<pair<int, int>>, compare> pq;

void input(){
	cin >> N >> M;
	for(int i=0;i<M;i++){
		int from, to, cost;
		cin >> from >> to >> cost;
		adj[from].push_back({to, cost});
		adj[to].push_back({from, cost});
	}
	cin >> s >> t;
}

int solution(){
	memset(distances, INF, sizeof(distances));
	distances[s] = 0;
	pq.push({s, 0});

	while(!pq.empty()){
		int curNode = pq.top().first;
		int cost = pq.top().second;
		pq.pop();

		for(auto &next : adj[curNode]){
			if(cost + next.second < distances[next.first]){
				distances[next.first] = cost + next.second;
				pq.push({next.first, distances[next.first]});
			}
		}
	}
	return distances[t];
}

int main(){
	fastio;
	input();
	cout << solution() << endl;

	return 0;
}

 

728x90
반응형