๋ฌธ์
ํ์ด
์๊ฐ์ฌํ์ ์์ํด ๋ค์ ์ถ๋ฐ์ ์ผ๋ก ๋์์์ ๋, ์๊ฐ์ด ๋๋์๊ฐ ๊ฒฝ์ฐ๊ฐ ์๋์ง ํ์ธํด์ผ ํ๋ค.
์๊ฐ์ ๊ฐ์ ์ด๋ผ๊ณ ์๊ฐํ์ ๋, ์๊ฐ ์ญํ์ ์์ ๊ฐ์ค์น๋ก ๋๊ณ ์์ ์ฌ์ดํด์ด ์กด์ฌํ๋ฉด ์๊ฐ ์ฌํ์ ํ ์ ์๋ค.
๊ฐ์ ์ ๊ฐ์ค์น์ ์์๊ฐ ์์ผ๋ฏ๋ก, ๋ฒจ๋ง ํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ํ์ฉํด ํ ์ ์์๋ค.
์ฐ์ ๋ชจ๋ ์ ์ ์ ์ต์ ๋น์ฉ์ ์๊ธฐ ์ํด ๋ฐ๋ณต๋ฌธ์ ๋ ๋ฒ ์ฌ์ฉํด ๋ชจ๋ ๊ฐ์ ์ ํ์ธํ๋ค.
๊ฐ์ ์ ๋ชจ๋ ํ์ํ ์ดํ, ๊ทธ๋ํ์ ์์ ์ฌ์ดํด์ด ์๋์ง ํ์ธํ๊ธฐ ์ํด ๊ฐ์ ์ ํ ๋ฒ ๋ ํ์ํ๋ค. ๋ง์ฝ ์์ ์ฌ์ดํด์ด ์กด์ฌํ๋ค๋ฉด, ์ต์๊ฐ์ด ๋ค์ ๊ฐฑ์ ๋๋ฏ๋ก true
๋ฅผ ๋ฆฌํดํ๋ค.
์ฝ๋
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <iostream>
#include <vector>
using namespace std;
struct Edge
{
int from, to, cost;
};
vector<Edge> graph;
bool bellmanFord(int n)
{
vector<int> dist(n + 1, 1e9);
dist[1] = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < graph.size(); j++)
{
int from = graph[j].from;
int to = graph[j].to;
int cost = graph[j].cost;
if (dist[from] + cost < dist[to])
{
dist[to] = dist[from] + cost;
}
}
}
for (int i = 0; i < graph.size(); i++)
{
int from = graph[i].from;
int to = graph[i].to;
int cost = graph[i].cost;
if (dist[to] > dist[from] + cost) return 1;
}
return 0;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
// test
int test_case;
cin >> test_case;
for (int tc = 0; tc < test_case; tc++)
{
// input & init
graph.clear();
int n, m, w;
cin >> n >> m >> w;
for (int i = 0; i < m; i++)
{
int s, e, t;
cin >> s >> e >> t;
graph.push_back({ s, e, t });
graph.push_back({ e, s, t });
}
for (int i = 0; i < w; i++)
{
int s, e, t;
cin >> s >> e >> t;
graph.push_back({ s, e, -t });
}
// solve
if (bellmanFord(n)) cout << "YES\n";
else cout << "NO\n";
}
return 0;
}
Leave a comment