백준 알고리즘 14284번 : 간선 이어가기 2
링크
https://www.acmicpc.net/problem/14284
문제
정점 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가 연결되는 시점의 간선의 가중치 합의 최솟값을 출력하시오,
예제 입력 및 출력
풀이법
무방향 그래프임을 명심하자
문제를 제대로 읽지 않고 풀어서 한번 틀렸다;
풀이 코드(C++)
#include <bits/stdc++.h>
#define X first
#define Y second
#define pb push_back
#define MAX 5001
#define INF 1e9
#define fastio ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
using namespace std;
using ll = long long;
using ull = unsigned long long;
using dbl = double;
using ldb = long double;
using pii = pair<int,int>;
using pll = pair<ll,ll>;
using vi = vector<int>;
#define sz(a) int((a).size())
vector<pii> adj[MAX];
vector<int> dist(MAX, INF);
void dijk(int start,int end){
priority_queue<pii, vector<pii>,greater<pii>> pq;
dist[start] = 0;
pq.push({0, start});
while(!pq.empty()){
int weight = pq.top().first;
int cur = pq.top().second;
pq.pop();
if(cur == end) return;
if(dist[cur] < weight) continue;
for(int i = 0; i < adj[cur].size(); i++){
int next = adj[cur][i].second;
int nWeight = adj[cur][i].first;
if(dist[next] > nWeight + weight){
dist[next] = nWeight + weight; // 가중치 갱신
pq.push({dist[next], next});
}
}
}
}
int main(){
fastio;
int n,m;
cin >> n >> m;
for(int i = 0; i < m; i++){
int u,v,w; cin >> u >> v >> w;
adj[u].pb({w,v});
adj[v].pb({w,u});
}
int s,t; cin >> s >> t;
dijk(s, t);
cout << dist[t] << "\n";
return 0;
}
Author And Source
이 문제에 관하여(백준 알고리즘 14284번 : 간선 이어가기 2), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@inwooleeme/백준-알고리즘-14284번-간선-이어가기-2저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)