Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 백준
- graph
- C++
- 사이클 없는 그래프
- boj #백준
- backtracking #codetree #디버깅 #삼성코테
- N번째큰수
- graph #최단경로
- 16202
- 3D #Reconstruction #computer #vision #volume #metric #tsdf #kinect #fusion
- 30870
- hcpc
- 줄어드는수
- LIS #가장긴증가하는부분수열 #
- 최소 #공배수 #최대 #공약수 #유클리드 #호제법 #lcm #gcd #c++ #boj #3343 #백준 #장미
- 3343
- 백준 #다익스트라 #dijkstra #9370 #c++
- 호반우 상인
- BOJ
- c++ #입출력 #속도 #ios #sync_with_stdio #cin #cout #tie
- 투포인터 #백준 #boj #20922 #22862
- 레드아보
- 쌤쌤쌤
- 코딩
- 1174
- 22869
- 20117
- 진법변환 #2to10 #10to2 #이진법 #십진법 #변환 #bitset #c++
- c++ #boj #
- 이분탐색 #dp #11053
Archives
- Today
- Total
hyunjin
[BOJ 9370 미확인 도착지] 다익스트라 dijkstra 그래프 최단경로 본문
728x90
S - G - H - T 혹은 S - H - G - T 의 경로가
S - T로 가는 최단 경로인지 확인하면 된다.
그래서 S,G,H 각각의 정점을 시작으로 하는 최단 길이를 다익스트라로 구한다.
#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
#define INF 0x7f7f7f7f
#define MAX_N 2001
using namespace std;
int N;
int S, G, H;
int dist[MAX_N][MAX_N], mdist[MAX_N], mdist_g[MAX_N], mdist_h[MAX_N];
bool vis[MAX_N];
void dijkstra(int start, int *d) {
memset(vis, 0, sizeof(vis));
d[start] = 0;
for (int i = 1; i <= N; i++) {
int v = 1, md = INF;
for (int j = 1; j <= N; j++) {
if (!vis[j] && d[j] < md) {
v = j;
md = d[j];
}
}
vis[v] = true;
for (int j = 1; j <= N; j++) {
if (!vis[j] && dist[v][j] != INF) {
d[j] = min(d[j],d[v] + dist[v][j]);
}
}
}
}
int main() {
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int TC;
cin >> TC;
while (TC--) {
int M, T;
cin >> N >> M >> T >> S >> G >> H;
memset(dist, 0x7f, sizeof(dist));
memset(mdist, 0x7f, sizeof(mdist));
memset(mdist_g, 0x7f, sizeof(mdist_g));
memset(mdist_h, 0x7f, sizeof(mdist_h));
while(M--) {
int a, b, d;
cin >> a >> b >> d;
dist[a][b] = d;
dist[b][a] = d;
}
dijkstra(S, mdist);
dijkstra(G, mdist_g);
dijkstra(H, mdist_h);
vector<int> vec;
while (T--) {
int to;
cin >> to;
if (mdist[to] == mdist[G] + dist[G][H] + mdist_h[to] ||
mdist[to] == mdist[H] + dist[G][H] + mdist_g[to])
vec.push_back(to);
}
sort(vec.begin(), vec.end());
for (int e : vec)
cout << e << " ";
cout << "\n";
}
return 0;
}
728x90
'알고리즘 연습 > 백준' 카테고리의 다른 글
[BOJ 3343 장미] 정수론, LCM (0) | 2024.04.25 |
---|---|
[BOJ 2933 미네랄] 구현 그래프 너비 깊이 우선 (0) | 2024.04.23 |
[투포인터 BOJ20922 BOJ22862] (0) | 2024.04.20 |
[가장 긴 증가하는 부분 수열] LIS, DP, 이분탐색 (0) | 2024.04.19 |
[BOJ 15663/15664 c++]N과 M, set, backtracking (0) | 2022.10.01 |