문제링크 : https://www.acmicpc.net/problem/18126
18126번: 너구리 구구
텔레토비 동산에 사는 너구리 구구는 입구, 거실, 주방, 안방, 공부방, 운동실, 음악실, 음식 창고 등 N개의 방을 가지고 있다. 입구를 포함한 모든 방은 1부터 N까지의 번호가 있고, 입구는 1번이
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const ll MAX = 10000000001*5000; //최대값 + 1
int N, A, B;
ll C, result;
vector<pair<int, ll>>v[5001];
ll dist[5001];
void bfs()
{
dist[1]=0; //시작점
queue<pair<int, ll>> q;
q.push({1, 0});
while(!q.empty())
{
auto[cur, cost] = q.front(); //현재위치, 현재거리값
q.pop();
for(int i=0; i<v[cur].size(); i++)
{
auto [next, ncost] = v[cur][i]; //다음위치, 다음거리값
if(dist[next] > cost + ncost)
{
dist[next] = cost + ncost;
q.push({next, dist[next]});
}
}
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> N;
for(int i=0; i<N-1; i++)
{
cin >> A >> B >> C;
v[A].push_back({B, C}); //양방향
v[B].push_back({A, C});
}
for(int i=1; i<=N; i++) dist[i] = MAX;
bfs();
for(int i=1; i<=N; i++) result = max(result, dist[i]); //최대거리
cout << result;
return 0;
}
먼저 양방향 그래프이므로 각 방향에 대한 값을 연결해준다.
그리고 거리를 저장해야하는데, 이를 우선 MAX 값으로 초기화 해준다.
이때 MAX값은 해당 문제에서 나올 수 있는 최대값인 1000000000*5000을 이용하여 설정했다. (N*C)
이후 bfs를 통해 연결된 값을 확인하며, 이때 현재 비용과 다음 비용을 합쳐 dist 배열에 갱신한다.
이후 dist배열에서 가장 큰 값을 출력하면 된다.
해당 문제에서 주의해야할 것은 값의 범위가 상당히 크다는 것이다.
따라서 cost와 관련된 값들에 longlong을 사용해주어야 한다.
'백준 > 실버' 카테고리의 다른 글
[백준 11558번] The Game of Death (C++) (0) | 2023.12.29 |
---|---|
[백준 15805번] 트리 나라 관광 가이드 (C++) (0) | 2023.12.27 |
[백준 27966번] △ (C++) (0) | 2023.12.22 |
[백준 18404번] 현명한 나이트 (C++) (0) | 2023.12.21 |
[백준 14675번] 단절점과 단절선 (C++) (0) | 2023.12.20 |