๐ ๋งํฌ
https://www.acmicpc.net/problem/16118
https://github.com/jokj624/PS/blob/master/10000-15000/16118.cpp
๐คฏ ํ์ค ํ๊ธฐ
๋๋๊ฐ ์ฌ์ฐ๋ณด๋ค ์ฝํ๋ค๋
๐คท ๋ฌธ์
๐ฉ๐ป ํ์ด
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ์ ์๋ ๋ฌธ์ ๋ค.
๋๋๋ ์ฌ์ฐ๋ณด๋ค 2๋ฐฐ ๋น ๋ฅด๊ฒ ๊ฐ๊ฑฐ๋ 2๋ฐฐ ๋๋ฆฌ๊ฒ ๊ฐ๋๊ฑธ ๋ฐ๋ณตํ๋ค. ์ฌ์ฐ๋ ์ผ์ ํ ์๋๋ก ๊ฑท๊ธฐ ๋๋ฌธ์ ์ฒ์์ cost ์์ฒด๋ฅผ 2๋ฐฐํ์ฌ ๋ฃ์ด์ค๋ค. ๊ทธ๋ฌ๋ฉด ๋๋๋ /2 ํน์ *2 ๋ก cost๋ฅผ ๊ณ์ฐํ๋ฉด ๋๋ค.
๊ตณ์ด 2๋ฐฐ๋ฅผ ํ๋ ์ด์ ๋ /2์์ ์ค์๊ฐ ๋์ฌ ์๋ ์์ด ์ ํํ์ง ์์! ๋ฏธ๋ฆฌ 2๋ฐฐ๋ฅผ ํ๋๊ฒ ํธํ๋ค.
๋จผ์ ์ฌ์ฐ๋ ์๋๊ฐ ์ผ์ ํ๊ธฐ ๋๋ฌธ์ ๋ฏธ๋ฆฌ ๋ค์ต์คํธ๋ผ๋ฅผ ํ๋ฒ ๋๋ ค์ ๊ฐ ๊ทธ๋ฃจํฐ๊ธฐ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด์ค๋ค.
๋๋๋ฅผ ๊ณ์ฐํด์ผํ๋๋ฐ ๊ธฐ์กด์ ๋ค์ต์คํธ๋ผ๋ก ๊ณ์ฐํ๋ 2๊ฐ๋ฅผ ๋ชจ๋ ๊ณ์ฐํด์ค์ผํ๋ค. ์ฌ๊ธฐ์ ์๋ฏธํ๋ 2๊ฐ๋ ๋๋๊ฐ ํด๋น ๊ทธ๋ฃจํฐ๊ธฐ๊น์ง 2๋ฐฐ์ ์๋ ฅ์ผ๋ก ๊ฐ์ ๋, ์ ๋ฐ์ ์๋ ฅ์ผ๋ก ๊ฐ์๋์ด๋ค.
2์ฐจ์ ๋ฐฐ์ด์ ๋ง๋ค์ด์ฃผ๊ณ , 0/1 ๋ก ๊ตฌ๋ถํ์ฌ ์ ์ฅํ๋ค. priority_queue ์์ ํ์ฌ ๊ทธ๋ฃจํฐ๊ธฐ์์ ๋ค์ ๊ทธ๋ฃจํฐ๊ธฐ๊น์ง ์ต๋จ ๊ฑฐ๋ฆฌ , ๋ค์ ๊ทธ๋ฃจํฐ๊ธฐ ๋ฒํธ, ์๋ ฅ์ ๋ฐ๋ผ 0์ธ์ง 1์ธ์ง๋ฅผ ์ ์ฅํด์ฃผ๋ฉด ๋๋ค.
๋๋๋ ๋ฒ๊ฐ์๊ฐ๋ฉด์ ์๋ ฅ์ด ๋ฐ๋๊ธฐ ๋๋ฌธ์ q์ front์ 0/1 ๋ณ์๊ฐ์ ๋ฐ๋ผ ๋ค์ ๊ทธ๋ฃจํฐ๊ธฐ๊น์ง๋ !๋ณ์ ๋ก ๋ฐ๊ฟ์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
์ต์ข ์ ์ผ๋ก ๊ตฌํ๊ณ ์ ํ๋ ๋ต์ ์ฌ์ฐ๊ฐ ๋๋๋ณด๋ค ๋จผ์ ๋์ฐฉํ ์ ์๋ ๊ทธ๋ฃจํฐ๊ธฐ ๊ฐ์์ด๊ธฐ ๋๋ฌธ์ ๋ง์ง๋ง์
min(wolf[๊ทธ๋ฃจํฐ๊ธฐ๋ฒํธ][0], wolf[๊ทธ๋ฃจํฐ๊ธฐ๋ฒํธ][1]) ๊ณผ ๊ธฐ์กด์ ๊ตฌํด๋ ์ฌ์ฐ์ ํด๋น ๊ทธ๋ฃจํฐ๊ธฐ d[๊ทธ๋ฃจํฐ๊ธฐ๋ฒํธ]๊น์ง ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๋น๊ตํ์ฌ ์ฌ์ฐ๊ฐ ๋ ์์ผ๋ฉด ์นด์ดํ ํด์ค๋ค.
๐ป ์ฝ๋
//AC
//BOJ 16118 ๋ฌ๋น ์ฌ์ฐ
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
#define INF 2e9+1
typedef long long ll;
typedef pair<ll, ll> edge;
vector<edge> graph[4001];
int main() {
int n, m;
cin >> n >> m;
ll d[n + 1];
ll wolf[n + 1][2];
bool c[n + 1];
for (int i = 0; i < m; i++){
int from, to, cost;
cin >> from >> to >> cost;
graph[from].push_back({to, cost*2});
graph[to].push_back({from, cost*2});
}
for (int i = 1; i <= n; i++){
d[i] = INF;
wolf[i][0] = INF; wolf[i][1] = INF;
c[i] = false;
}
priority_queue<edge, vector<edge>, greater<edge>> pq;
pq.push({0, 1});
d[1]=0;
while (!pq.empty()) { // ์ฌ์ฐ
ll x = pq.top().second;
pq.pop();
if (!c[x]){
c[x] = true;
for (int j = 0; j < graph[x].size(); j++){
int y = graph[x][j].first;
if (d[y] > d[x] + graph[x][j].second) {
d[y] = d[x] + graph[x][j].second;
pq.push({d[y], y});
}
}
}
}
priority_queue<pair<ll, pair<ll, ll>>> pq2;
pq2.push({0, {1, 0}}); // ๋๋
wolf[1][0] = 0;
while (!pq2.empty()) {
ll cc = -pq2.top().first;
ll x = pq2.top().second.first;
ll z = pq2.top().second.second;
pq2.pop();
if(wolf[x][z] < cc) continue;
for (int j = 0; j < graph[x].size(); j++) {
int y = graph[x][j].first;
ll nextCost = 0;
if(z) nextCost = graph[x][j].second * 2;
else nextCost = graph[x][j].second / 2;
if (wolf[y][!z] > cc + nextCost) {
wolf[y][!z] = cc + nextCost;
pq2.push({-wolf[y][!z], {y, !z}});
}
}
}
ll ans = 0;
for(int i=1; i<=n; i++){
if(d[i] < min(wolf[i][0], wolf[i][1]) && d[i] != INF){
ans += 1;
}
}
printf("%lld", ans);
return 0;
}
'DEV > PS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ/13904] ๊ณผ์ , c++ (0) | 2021.08.10 |
---|---|
[BOJ/22352] ํญ์ฒด์ธ์, c++ (0) | 2021.08.05 |
[BOJ/20136] ๋ฉํฐํญ ์ค์ผ์ค๋ง 2 (0) | 2021.06.26 |
[BOJ/21924] ๋์ ๊ฑด์ค, c++ (0) | 2021.06.08 |
[BOJ/2023] ์ ๊ธฐํ ์์, c++ (1) | 2021.06.08 |