개인사
[G5] 백준 6248번 Bronze Cow Party C++ 다익스트라 본문
728x90

리뷰

https://www.acmicpc.net/problem/6248
점심시간에 부랴부랴 푼 기본적인 다익스트라 문제
전역 변수
- N : 배열의 최대 개수를 정의할 상수 변수
- n : 노드의 개수를 저장할 변수
- m : 간선의 개수를 저장할 변수
- x : 중심 노드의 번호를 저장할 변수
- Edge : 간선 정보를 정의할 구조체
- edges : 인접 리스트를 저장할 Edge타입 벡터 배열
- Pos : 현재 위치와 누적 가중치를 정의할 구조체, 누적 가중치를 기준으로 오름차순 정렬한다.
함수
1. dijkstra
int dijkstra()
{
priority_queue< Pos > pq;
pq.push( { x, 0 } );
vector< int > dist( n + 1, 2e9 );
dist[ x ] = 0;
while ( !pq.empty() )
{
const auto [cn, cv] = pq.top(); pq.pop();
if ( dist[ cn ] < cv )
continue;
for ( const auto& [nn, w] : edges[ cn ] )
{
int nv = cv + w;
if ( dist[ nn ] > nv )
{
dist[ nn ] = nv;
pq.push( { nn, nv } );
}
}
}
int mx = 0;
for ( int i = 1; i <= n; ++i )
mx = max( mx, dist[ i ] );
return mx * 2;
}
목적지로부터 모든 노드까지의 최대 왕복 거리를 구하기 위한 함수
문제풀이
- n, m, x값을 입력받고, m개의 간선 정보를 입력 받아 edges를 초기화한다.
- dijkstra함수를 호출하여 벡터 dist에 모든 노드까지의 거리를 구한다.
- 변수 mx를 0으로 초기화 하고, dist를 순회하며 가장 큰 값을 mx에 저장한다.
- mx*2를 리턴하고, 리턴값을 호출한다.
트러블 슈팅
없음
참고 사항
- 간선이 중복으로 들어올 수 있다.
- 해당 부분을 N*N배열로 최소값을 기록하여 인접리스트에 저장하면 메모리는 늘지만 속도는 줄일 수 있어보인다.
정답 코드
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
const int N = 1001;
int n, m, x;
struct Edge
{
int nn, w;
};
vector < Edge > edges[ N ];
struct Pos
{
int cn, cv;
bool operator<( const Pos& other ) const
{
return cv > other.cv;
}
};
int dijkstra()
{
priority_queue< Pos > pq;
pq.push( { x, 0 } );
vector< int > dist( n + 1, 2e9 );
dist[ x ] = 0;
while ( !pq.empty() )
{
const auto [cn, cv] = pq.top(); pq.pop();
if ( dist[ cn ] < cv )
continue;
for ( const auto& [nn, w] : edges[ cn ] )
{
int nv = cv + w;
if ( dist[ nn ] > nv )
{
dist[ nn ] = nv;
pq.push( { nn, nv } );
}
}
}
int mx = 0;
for ( int i = 1; i <= n; ++i )
mx = max( mx, dist[ i ] );
return mx * 2;
}
int main()
{
ios::sync_with_stdio( 0 );
cin.tie( 0 );
cin >> n >> m >> x;
while ( m-- )
{
int f, t, w; cin >> f >> t >> w;
edges[ f ].push_back( { t, w } );
edges[ t ].push_back( { f, w } );
}
cout << dijkstra();
}728x90
'알고리즘 공부 > C++' 카테고리의 다른 글
| [G5] 백준 17352번 여러분의 다리가 되어 드리겠습니다! C++ 너비 우선 탐색, 분리 집합 (0) | 2026.04.05 |
|---|---|
| [G4] 백준 16432번 떡장수와 호랑이 C++ DFS, DP (0) | 2026.04.04 |
| [G5] 백준 12980번 좋아하는 수열 C++ 백트래킹 (0) | 2026.03.24 |
| [G1] 백준 32644번 랜덤 넘버 추측하기 C++ 세그먼트 트리 (0) | 2026.03.22 |
| [G5] 백준 14588번 Line Friends (Small) C++ 플로이드 와샬, 최단 거리 (0) | 2026.03.19 |
