알고리즘 모음(C++)

백준 14284 - 간선 이어가기 2(C++) 본문

백준

백준 14284 - 간선 이어가기 2(C++)

공대생의 잡다한 사전 2023. 11. 15. 23:35

문제 링크입니다. https://www.acmicpc.net/problem/14284

14284번: 간선 이어가기 2

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

www.acmicpc.net

다익스트라를 이용하는 문제입니다.

가중치가 주어졌을 때, 연결할 수 있는 최솟값을 출력하는 문제입니다.

연결했을 때의 최솟값만 출력하면 되기에 다익스트라 알고리즘을 이용해서 풀어주면 됩니다.

자세한 것은 코드를 참고해주세요.

#define _CRT_SECURE_NO_WARNINGS
#include <cstring>
#include <vector>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cmath>
#include <cstdio>
#include <string>
#include <deque>
#define INF 2100000000
#define F first
#define S second

using namespace std;

priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;
int Distance[5001];
int N, M, s, t;
vector<pair<int, int>> connect[5001];

void reset_distance(){
	for(int i = 1; i <= N; i++) Distance[i] = INF;
}

void dijstra(){
	Distance[s] = 0;
	q.push({Distance[s], s});
	while(!q.empty()){
		int x = q.top().S;
		int cost = q.top().F;
		q.pop();
		if(x == t) return;
		for(int i = 0; i < connect[x].size(); i++){
			int xx = connect[x][i].F;
			int n_cost = Distance[x] + connect[x][i].S;
			if(n_cost < Distance[xx]){
				Distance[xx] = n_cost;
				q.push({n_cost, xx});
			}
		}	
	}
}

void solve(){
	reset_distance();
	dijstra();
	cout << Distance[t];
}


int main() {
	cin.tie(0);
	cout.tie(0);
	cin >> N >> M;
	for(int i = 1; i <= M; i++){
		int x, y, cost;
		cin >> x >> y >> cost;
		connect[x].push_back({y, cost});
		connect[y].push_back({x, cost});
	}
	cin >> s >> t;	
	solve();
	return 0;
}


질문 및 조언은 댓글을 남겨주세요.

'백준' 카테고리의 다른 글

백준 13424 - 비밀 모임(C++)  (1) 2023.11.20
백준 13398 - 연속합 2(C++)  (1) 2023.11.20
백준 1719 - 택배(C++)  (0) 2023.11.06
백준 1446 - 지름길(C++)  (0) 2023.11.06
백준 18232 - 텔레포트 정거장(C++)  (1) 2023.10.23