๐ ๋งํฌ
https://www.acmicpc.net/problem/20128
https://github.com/jokj624/PS/blob/master/20000-25000/20128.cpp
๐คฏ ํ์ค ํ๊ธฐ
์ ์ ํ์ง!
๐คท ๋ฌธ์
๐ฉ๐ป ํ์ด
๊ฐ๋ง์ ํผ dijkstra ๋ฌธ์ !
์ง์ ์ต๋จ๊ฑฐ๋ฆฌ, ํ์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๋๋ ์ ๊ตฌํด์ฃผ๋ ๋ฌธ์ ์ด๋ค.
1๋ฒ ์ ์ ์์ ๋ชจ๋ ์ ์ ์ผ๋ก ๋ค์ต์คํธ๋ผ๋ฅผ ๋๋ฆด๊ฑด๋ฐ odd, even ๊ฑฐ๋ฆฌ๋ฅผ ๋ฐ๋ก ๊ตฌํด์ค๋ค.
ํคํฌ์ธํธ๋
1. ํ์ + ํ์ = ์ง์
2. ์ง์ + ํ์ = ํ์
3. ์ง์ + ์ง์ = ์ง์
ํ์ฌ ์ ์ ์์ ๋ค๋ฅธ ์ ์ ์ผ๋ก ์ด๋ํ ๋ ๊ฐ์ ์ ๋น์ฉ์ด ํ์์ธ์ง, ์ง์์ธ์ง ๊ตฌ๋ถํด์ ๊ฐ ๊ฐ update ํด์ฃผ๋ฉด ๋๋ค.
ํ/์ง ๊ฑฐ๋ฆฌ ์ค ํ๋๋ผ๋ update ๋๋ค๋ฉด queue์ ๋ค์ ๋ฃ์ด์ค๋ค.
๐ป ์ฝ๋
//AC
//BOJ 20218 Parity Constraint Shortest Path
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
#define INF 9223372036854775807
typedef long long ll;
typedef pair<ll, ll> pll;
typedef pair<ll, int> pli;
typedef pair<pll, int> ppli;
priority_queue<ppli, vector<ppli>, greater<ppli>> pq;
vector<pll> v[101010];
ll odd[101010];
ll even[101010];
bool ck[101010];
int main(){
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int N, M, x, y, c;
cin >> N >> M;
for(int i=0; i<M; i++) {
cin >> x >> y >> c;
v[x].push_back({y, c});
v[y].push_back({x, c});
}
for(int i=1; i<=N; i++) {
odd[i] = INF;
even[i] = INF;
}
even[1] = 0; // 1->1 ์ง์ ์ต์๋ ๋ฌด์กฐ๊ฑด 0
pq.push({{odd[1], even[1]}, 1});
while(!pq.empty()) {
int xx = pq.top().second;
pq.pop();
for(auto tmp : v[xx]) {
ll yy = tmp.first;
if(tmp.second % 2) {
int check = 0;
if(odd[yy] > even[xx] + tmp.second && even[xx] != INF) { // ์ง์ + ํ์ = ํ์
odd[yy] = even[xx] + tmp.second;
check = 1;
}
if(even[yy] > odd[xx] + tmp.second && odd[xx] != INF) { // ํ์ + ํ์ = ์ง์
even[yy] = odd[xx] + tmp.second;
check = 1;
}
if(check) pq.push({{odd[yy],even[yy]}, yy});
}
else {
int check = 0;
if(even[yy] > even[xx] + tmp.second && even[xx] != INF) { // ์ง์ + ์ง์ = ์ง์
even[yy] = even[xx] + tmp.second;
check = 1;
}
if(odd[yy] > odd[xx] + tmp.second && odd[xx] != INF) { // ์ง์ + ํ์ = ํ์
odd[yy] = odd[xx] + tmp.second;
check = 1;
}
if(check) pq.push({{odd[yy], even[yy]}, yy});
}
}
}
for(int i=1; i<=N; i++) {
if(odd[i] != INF) cout << odd[i] << " ";
else cout << -1 << " ";
if(even[i] != INF) cout << even[i] << " ";
else cout << -1 << " ";
cout << "\n";
}
return 0;
}
'DEV > PS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ/20208] ์ง์ฐ์ ๋ฏผํธ์ด์ฝ ์ฐ์ , c++ (0) | 2021.09.20 |
---|---|
[BOJ/14746] Closest Pair, c++ (0) | 2021.09.20 |
[BOJ/20666] ์ธ๋ฌผ์ด์ ์ ์, c++ (2) | 2021.08.20 |
[BOJ/20665] ๋ ์์ค ๊ฑฐ๋ฆฌ๋๊ธฐ, c++ (2) | 2021.08.20 |
[BOJ/11280] 2-SAT - 3, c++ (2) | 2021.08.19 |