티스토리 뷰
문제
https://www.acmicpc.net/problem/5917
알고리즘
Dijkstra
풀이
최단거리 중 하나의 간선의 값을 두배로 하였을 때의 최댓값을 구하는 문제입니다.
다익스트라임은 최단거리임을 보고 알 수 있습니다. 문제 제한은 $N$이 100 이하, $M$은 10000 이하입니다. 단순한 접근으로는 $M$의 간선들을 하나씩 두배로 만든 후 그때마다 새로이 다익스트라를 사용하는 것입니다.
하지만 $M$제한이 10000이므로 이 방법은 무리가 있습니다. 이 방법에는 불필요한 부분이 있습니다. 바로 최단거리에 포함되지 않는 간선들 또한 두 배로 바꾸는 것입니다. 이는 아무런 의미가 없는 행동입니다. $N$개로 이루어진 노드에서 최단거리는 최대 $N-1$개의 간선을 통해 이루어져 있습니다. 즉 최단거리에 포함되는 간선들을 찾고 그 간선들만 두배로 한 후 다익스트라를 해서 가장 큰 값을 찾으면 됩니다.
코드
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < n; ++i)
#define REP(i, n) for (int i = 1; i <= n; ++i)
using namespace std;
typedef pair<int, int> pii;
const int MAXN = 105;
int N, M;
int adj[MAXN][MAXN];
int parent[MAXN];
int dist[MAXN];
vector<pii> vt;
void dijkstra() {
memset(dist, 0x3f, sizeof(dist));
priority_queue<pii, vector<pii>, greater<pii>> pq;
dist[0] = 0;
pq.emplace(0, 0);
while (!pq.empty()) {
auto [hereCost, here] = pq.top();
pq.pop();
if (dist[here] < hereCost) continue;
rep(i, N) {
if (adj[here][i] != 0x3f3f3f3f) {
if (dist[i] > dist[here] + adj[here][i]) {
parent[i] = here;
dist[i] = dist[here] + adj[here][i];
pq.emplace(dist[i], i);
}
}
}
}
}
void _path(int s, int e) {
if (s != e) {
vt.emplace_back(parent[e], e);
_path(s, parent[e]);
}
}
int main() {
#ifndef ONLINE_JUDGE
freopen("in", "r", stdin);
freopen("out", "w", stdout);
#endif
cin.tie(NULL);
cout.tie(NULL);
ios::sync_with_stdio(false);
memset(adj, 0x3f, sizeof(adj));
cin >> N >> M;
rep(i, M) {
int u, v, c;
cin >> u >> v >> c;
--u, --v;
adj[u][v] = c;
adj[v][u] = c;
}
dijkstra();
int MIN = dist[N - 1];
int secMin = 0;
_path(0, N - 1);
for (auto [a, b] : vt) {
int prvDist = adj[a][b];
adj[a][b] = adj[b][a] = prvDist * 2;
dijkstra();
secMin = max(secMin, dist[N - 1]);
adj[a][b] = adj[b][a] = prvDist;
}
cout << secMin - MIN;
return 0;
}
'Algorithm' 카테고리의 다른 글
[백준 5214] 환승 (0) | 2021.06.25 |
---|---|
[백준 2437] 저울 (2) | 2021.06.13 |
[백준 17612] 쇼핑몰 (0) | 2021.05.28 |
[백준 10652] Piggy Back (0) | 2021.05.27 |
[백준 9869] Milk Scheduling (0) | 2021.05.23 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- sorting
- 정렬
- Oracle
- dijkstra
- 동적계획법
- string
- Segment tree
- 이분탐색
- implementation
- spring
- 스위핑
- Fenwick
- DP
- 세그먼트트리
- 이분매칭
- kmp
- 좌표압축
- knapsack
- bfs
- spring boot
- union find
- 2-SAT
- 트라이
- SCC
- Suffix Array
- 펜윅트리
- dfs
- sweeping
- greedy
- hld
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함