https://www.acmicpc.net/problem/1865
๋ฌธ์
๋๋ 2020๋ , ๋ฐฑ์ค์ด๋ ์๋๋๋ผ์ ํ ๊ตญ๋ฏผ์ด๋ค. ์๋๋๋ผ์๋ N๊ฐ์ ์ง์ ์ด ์๊ณ N๊ฐ์ ์ง์ ์ฌ์ด์๋ M๊ฐ์ ๋๋ก์ W๊ฐ์ ์ํ์ด ์๋ค. (๋จ ๋๋ก๋ ๋ฐฉํฅ์ด ์์ผ๋ฉฐ ์ํ์ ๋ฐฉํฅ์ด ์๋ค.) ์ํ์ ์์ ์์น์์ ๋์ฐฉ ์์น๋ก ๊ฐ๋ ํ๋์ ๊ฒฝ๋ก์ธ๋ฐ, ํน์ดํ๊ฒ๋ ๋์ฐฉ์ ํ๊ฒ ๋๋ฉด ์์์ ํ์์ ๋๋ณด๋ค ์๊ฐ์ด ๋ค๋ก ๊ฐ๊ฒ ๋๋ค. ์ํ ๋ด์์๋ ์๊ณ๊ฐ ๊ฑฐ๊พธ๋ก ๊ฐ๋ค๊ณ ์๊ฐํ์ฌ๋ ์ข๋ค.
์๊ฐ ์ฌํ์ ๋งค์ฐ ์ข์ํ๋ ๋ฐฑ์ค์ด๋ ํ ๊ฐ์ง ๊ถ๊ธ์ฆ์ ๋น ์ก๋ค. ํ ์ง์ ์์ ์ถ๋ฐ์ ํ์ฌ์ ์๊ฐ์ฌํ์ ํ๊ธฐ ์์ํ์ฌ ๋ค์ ์ถ๋ฐ์ ํ์๋ ์์น๋ก ๋์์์ ๋, ์ถ๋ฐ์ ํ์์ ๋๋ณด๋ค ์๊ฐ์ด ๋๋์๊ฐ ์๋ ๊ฒฝ์ฐ๊ฐ ์๋์ง ์๋์ง ๊ถ๊ธํด์ก๋ค. ์ฌ๋ฌ๋ถ์ ๋ฐฑ์ค์ด๋ฅผ ๋์ ์ด๋ฐ ์ผ์ด ๊ฐ๋ฅํ์ง ๋ถ๊ฐ๋ฅํ์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์ฌ๋ผ.
์ ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์๋ ํ ์คํธ์ผ์ด์ค์ ๊ฐ์ TC(1 ≤ TC ≤ 5)๊ฐ ์ฃผ์ด์ง๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ๋ฒ์งธ ์ค๋ถํฐ TC๊ฐ์ ํ ์คํธ์ผ์ด์ค๊ฐ ์ฐจ๋ก๋ก ์ฃผ์ด์ง๋๋ฐ ๊ฐ ํ ์คํธ์ผ์ด์ค์ ์ฒซ ๋ฒ์งธ ์ค์๋ ์ง์ ์ ์ N(1 ≤ N ≤ 500), ๋๋ก์ ๊ฐ์ M(1 ≤ M ≤ 2500), ์ํ์ ๊ฐ์ W(1 ≤ W ≤ 200)์ด ์ฃผ์ด์ง๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ๋ฒ์งธ ์ค๋ถํฐ M+1๋ฒ์งธ ์ค์ ๋๋ก์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋๋ฐ ๊ฐ ๋๋ก์ ์ ๋ณด๋ S, E, T ์ธ ์ ์๋ก ์ฃผ์ด์ง๋ค. S์ E๋ ์ฐ๊ฒฐ๋ ์ง์ ์ ๋ฒํธ, T๋ ์ด ๋๋ก๋ฅผ ํตํด ์ด๋ํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์๋ฏธํ๋ค. ๊ทธ๋ฆฌ๊ณ M+2๋ฒ์งธ ์ค๋ถํฐ M+W+1๋ฒ์งธ ์ค๊น์ง ์ํ์ ์ ๋ณด๊ฐ S, E, T ์ธ ์ ์๋ก ์ฃผ์ด์ง๋๋ฐ S๋ ์์ ์ง์ , E๋ ๋์ฐฉ ์ง์ , T๋ ์ค์ด๋๋ ์๊ฐ์ ์๋ฏธํ๋ค. T๋ 10,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์ ๋๋ 0์ด๋ค.
๋ ์ง์ ์ ์ฐ๊ฒฐํ๋ ๋๋ก๊ฐ ํ ๊ฐ๋ณด๋ค ๋ง์ ์๋ ์๋ค. ์ง์ ์ ๋ฒํธ๋ 1๋ถํฐ N๊น์ง ์์ฐ์๋ก ์ค๋ณต ์์ด ๋งค๊ฒจ์ ธ ์๋ค.
์ถ๋ ฅ
TC๊ฐ์ ์ค์ ๊ฑธ์ณ์ ๋ง์ฝ์ ์๊ฐ์ด ์ค์ด๋ค๋ฉด์ ์ถ๋ฐ ์์น๋ก ๋์์ค๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ฉด YES, ๋ถ๊ฐ๋ฅํ๋ฉด NO๋ฅผ ์ถ๋ ฅํ๋ค.
ํ์ด
์ฐ์ .. ์ ๋ ฅ์ด ์๋นํ ๋ณต์กํ๊ฒ ๋์ค๋ฏ๋ก ์์ ๋ฅผ ์ง์ ๋จธ๋ฆฌ์์ผ๋ก ๊ตฌํํด๋ณด๋ฉฐ ์ ๋ ฅ ํํ๋ฅผ ์ ํ์ ํ์
๋๋ก,,, ์ํ ๊ฝค๋ ๋ณต์กํด๋ณด์ด์ง๋ง ๊ฒฐ๋ก ์ ์ผ๋ก๋
๊ฐ์ค์น๋ฅผ ํฉํ์๋ ์์๊ฐ ๋์ค๋ "์์์ฌ์ดํด" ์ด ์๋์ง๋ง ํ์ธํ๋ฉด ๋๋ค
์์ ๊ฐ์ค์น๋ฅผ ์ง๋ ๊ฐ์ ์ด ์์ ๋ ์ต๋จ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๊ธฐ ์ํด ๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด๋ณด๋ฉด
[๐ฒ Altu-Bitu/1101 ์ต๋จ๊ฒฝ๋ก] - ๋ฐฑ์ค 11657๋ฒ: ํ์๋จธ์
์ต๋จ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๊ณผ์ ์์ ์์ ์ฌ์ดํด์ ๋ฐ๊ฒฌํ์ ๋ ํจ์๋ฅผ ์ค๋จํด์ค์ผํ๋ค.
์ด ๋ถ๋ถ์ ์ด์ฉํ์ฌ ๋ณธ ๋ฌธ์ ์์๋ ์์์ฌ์ดํด์ ์กด์ฌ ์ฌ๋ถ๋ง ์์๋ด๋ฉด ๋๋ค.
๊ฝค ์ค๋ ๊ณ ๋ฏผ์ ํตํด ํ์๋๋ฐ,,
๊ทธ ๊ณ ๋ฏผ์ ํ์ ์ ์ฝ๋ ์๋ ์ํ์ฐฉ์ค์.. ใ ใ
// Authored by : seondal
// Co-authored by : -
// #include <bits/stdc++.h>
#include <iostream>
#include <vector>
#include <tuple>
using namespace std;
typedef tuple<int, int, int> tp;
const int INF = 6e7; // ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ต๋๊ฐ : ๊ฐ์ ๊ฐฏ์(2500+2500+500)*์๊ฐ(10000) = 52e6
bool isThereNegativeCycle(int n, int path, vector<tp>&edges) {
vector<int> dist(n+1, INF);
for(int i=1; i<=n; i++) {
for(int j=0; j<path; j++) {
int s, d, w;
tie(s,d,w) = edges[j];
int next_weight = dist[s] + w;
if(next_weight < dist[d]) {
dist[d] = next_weight;
if(i==n)
return true;
}
}
}
return false;
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int tc, n,m,w, s,e,t;
cin >> tc;
while(tc--) {
// ์
๋ ฅ
cin >> n >> m >> w;
vector<tp> edges; // ๊ฐ์ ์ ๋ณด ์ ์ฅ
for(int i=0; i<m; i++) { // ๋๋ก์ ๋ณด ์
๋ ฅ๋ฐ๊ธฐ (์๋ฐฉํฅ)
cin >> s >> e >> t;
edges.push_back({s, e, t});
edges.push_back({e, s, t});
}
for(int i=0; i<w; i++) { // ์ํ์ ๋ณด ์
๋ ฅ๋ฐ๊ธฐ (๋จ๋ฐฉํฅ)
cin >> s >> e >> t;
edges.push_back({s, e, t*-1});
}
// ์ถ๋ ฅ
if(isThereNegativeCycle(n, 2*m+w, edges))
cout << "YES\n";
else
cout << "NO\n";
}
return 0;
}
/*
*/
์ํ์ฐฉ์ค 1
์์ ๋ ์ ๋๋๋ฐ 5% ์ ๋์์ ํ๋ ธ์ต๋๋ค ๊ฐ ๋จ๋๊ฒฝ์ฐ,
์์์ ์ด ๋จ์ ๋์ด์์ด์ ์์์ฌ์ดํด์ด ๋์ค์ง ์์ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํ์
์ํ์ฐฉ์ค 2
์ ์ํ์ฐฉ์ค1์ ๊ฒช๊ณ ,
์ฒ์์๋ ๋ชจ๋ ์ ์ ๋ฒจ๋งํฌ๋(๋ค์ต์คํธ๋ผ)์ ์์์ ์ผ๋ก ๋๋ ค๋ณด๋ฉฐ ์์ ์ฌ์ดํด์ ์ฐพ์๋๋ฐ
94% ์ ๋์์ ์๊ฐ์ด๊ณผ ๊ฐ ๋ด๋ค.
// for๋ฌธ์ผ๋ก ๋๋ ค์ฃผ๊ธฐ
bool isThereNegativeCycle(int start, int n, int path, vector<tp>&edges) {
while(start <= n) {
vector<int> dist(n+1, INF);
dist[start] = 0;
for(int i=1; i<=n; i++) {
for(int j=0; j<path; j++) {
int s, d, w;
tie(s,d,w) = edges[j];
if(dist[s] == INF)
continue;
int next_weight = dist[s] + w;
if(next_weight < dist[d]) {
dist[d] = next_weight;
if(i==n)
return true;
}
}
}
start++;
}
return false;
}
// ์ฌ๊ทํจ์๋ก ๋๋ ค๋ณด๊ธฐ
bool isThereNegativeCycle(int start, int n, int path, vector<tp>&edges) {
if(start>n) // ๋ชจ๋ ์ ์ ์ ์์์ ์ผ๋ก ํด๋ดค์์๋ ์์ฌ์ดํด์ด ์๋ค๋ฉด
return false;
vector<int> dist(n+1, INF);
dist[start] = 0;
for(int i=1; i<=n; i++) {
for(int j=0; j<path; j++) {
int s, d, w;
tie(s,d,w) = edges[j];
if(dist[s] == INF)
continue;
int next_weight = dist[s] + w;
if(next_weight < dist[d]) {
dist[d] = next_weight;
if(i==n)
return true;
}
}
}
return isThereNegativeCycle(start+1, n, path, edges);
}
์๋ฌด๋๋ ๋ฐ๋ณต๋ฌธ์ 3์ค์ผ๋ก ๋๋ฆฌ๋๊ฑด ๋ฌด๋ฆฌ์๋ค.
์๊ฐ์ ์ด๋ป๊ฒ ์ค์ผ์ง๋ง ๊ณ ๋ฏผ์ ํ๋๋ฐ,,
์๊ณ ๋ณด๋ ์์์ ์ ์ค์ํ์ง ์์๋ค (!)
๋ณธ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ ค๋ณด๋ฉฐ ์์์ฌ์ดํด์ด ์๋์ง๋ง ํ์ธํ๋ฉด ๋๊ธฐ ๋๋ฌธ์
dist[start]=0 ์ผ๋ก ์ด๊ธฐํํ๋ ๊ณผ์ ๋,
dist[d]==INF ๋ฅผ ํ๋จํ๋ ๊ณผ์ ๋,
์ ํ ํ์ํ์ง ์์๋ค.
์ฐธ๊ณ
https://4z7l.github.io/2021/03/04/algorithms-boj-1865.html
'๐๏ธ ICPC Sinchon > Shortest Path' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค 11657๋ฒ: ํ์๋จธ์ (0) | 2022.11.03 |
---|---|
[BOJ G4][C++] ๋ฐฑ์ค 1719๋ฒ: ํ๋ฐฐ (0) | 2022.11.03 |
๋ฐฑ์ค 11404๋ฒ: ํ๋ก์ด๋ (0) | 2022.11.03 |
[BOJ G4][C++] ๋ฐฑ์ค 10282๋ฒ: ํดํน (0) | 2022.11.01 |
๋ฐฑ์ค 1753๋ฒ: ์ต๋จ๊ฒฝ๋ก (0) | 2022.11.01 |