๋ฌธ์ (์ถ์ฒ: https://www.acmicpc.net/problem/1865)
< ์ํ >
๋ฌธ์ ํ์ด
๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด์ ํด๊ฒฐํ๋ค.
์ฒ์์๋ ๋ฐ์ดํฌ์คํธ๋ผ๋ฅผ ์ฌ์ฉํด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋์ง ์์์ง๋ง ์์ ๊ฐ์ค์น๊ฐ ์์ ๊ฒฝ์ฐ ๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค. ๋ฐ์ดํฌ์คํธ๋ผ๋ฅผ ์ฌ์ฉํด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ์ฐพ์๋ณด๋ ์์ ๊ฐ์ค์น๊ฐ ์๋ค๊ณ ํด์ ๋ฐ์ดํฌ์คํธ๋ผ๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด ์๋๋ผ ์ฌ์ดํด ํ์ฑ ์ฌ๋ถ์ ๋ฐ๋ผ ์ฌ์ฉ ์ฌ๋ถ๊ฐ ๊ฐ๋ฆฌ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฒ ๋์๋ค.
my solution (Java)
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class _1865_ { // ์ํ
static class Edge {
private int start;
private int end;
private int d;
public Edge(int start, int end, int d) {
this.start = start;
this.end = end;
this.d = d;
}
}
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
int t = Integer.parseInt(bf.readLine());
ArrayList<Edge> list = new ArrayList<>();
int result[];
boolean visited[];
boolean flag = false;
for (int i = 0; i < t; i++) {
st = new StringTokenizer(bf.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int w = Integer.parseInt(st.nextToken());
result = new int[n + 1];
visited = new boolean[n + 1];
flag = false;
for (int j = 0; j < m; j++) {
st = new StringTokenizer(bf.readLine());
int s = Integer.parseInt(st.nextToken());
int e = Integer.parseInt(st.nextToken());
int d = Integer.parseInt(st.nextToken());
list.add(new Edge(s, e, d));
list.add(new Edge(e, s, d));
}
for (int j = 0; j < w; j++) {
st = new StringTokenizer(bf.readLine());
int s = Integer.parseInt(st.nextToken());
int e = Integer.parseInt(st.nextToken());
int d = Integer.parseInt(st.nextToken());
list.add(new Edge(s, e, -d));
}
for (int j = 1; j <= n; j++) {
if (visited[j]) {
continue;
}
for (int k = 1; k <= n; k++) {
result[k] = Integer.MAX_VALUE;
}
visited[j] = true;
result[j] = 0;
for (int k = 0; k < n; k++) {
for (int v = 0; v < list.size(); v++) {
Edge edge = list.get(v);
if (result[edge.start] != Integer.MAX_VALUE && result[edge.end] > result[edge.start] + edge.d) {
result[edge.end] = result[edge.start] + edge.d;
visited[edge.end] = true;
if (k == n - 1) {
flag = true;
break;
}
}
}
if (flag) {
break;
}
}
if (flag) {
break;
}
}
if (flag) {
bw.write("YES\n");
} else {
bw.write("NO\n");
}
list.clear();
}
bw.flush();
}
}
๋ณ์)
Edge : ์์ ์ง์ , ๋์ฐฉ ์ง์ , ์๊ฐ
t : ํ ์คํธ ์ผ์ด์ค ๊ฐ์
list : ๊ทธ๋ํ
result : ์ด๋ํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ
visited : ๋ฐฉ๋ฌธ ์ฌ๋ถ
flag : ์๊ฐ์ด ์ค์ด๋ค๋ฉด์ ์ถ๋ฐ ์์น๋ก ๋์์ค๋ ๊ฒ์ด ๊ฐ๋ฅํ์ง ์ฌ๋ถ
n, m, w : ์ง์ ์ ์, ๋๋ก์ ๊ฐ์, ์ํ์ ๊ฐ์
s, e, d : ์์ ์ง์ , ๋์ฐฉ ์ง์ , ์ค์ด๋๋ ์๊ฐ
Edge
์์ ์ง์ , ๋์ฐฉ ์ง์ , ์๊ฐ์ ๋ณ์๋ก ๊ฐ์ง
Main
ํ ์คํธ ์ผ์ด์ค ์๋งํผ ์๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
์ง์ ์ ์, ๋๋ก์ ๊ฐ์, ์ํ์ ๊ฐ์๋ฅผ ์ ๋ ฅ๋ฐ๋๋ค. ๋๋ก์ ๊ฐ์๋งํผ ๋๋ก์ ์ ๋ณด๋ฅผ ์ ๋ ฅ๋ฐ์ ์๋ฐฉํฅ์ผ๋ก ์ ์ฅํ๋ค. ์ํ์ ๊ฐ์๋งํผ ์ํ์ ์ ๋ณด๋ฅผ ์ ๋ ฅ๋ฐ์ ๋จ๋ฐฉํฅ์ผ๋ก ์ ์ฅํ๋ค. ์ถ๋ฐ ์ง์ ์ด ์ ํด์ ธ ์์ง ์์ผ๋ฏ๋ก ๋ชจ๋ ์ง์ ์์ ์์ํ๊ธฐ ์ํด ์ง์ ์ ์๋งํผ ๋ฐ๋ณตํ๋ค. ๋ง์ฝ ์ด๋ฏธ ๋ฐฉ๋ฌธํ๋ ๊ณณ์ด๋ผ๋ฉด ๋ค์ ์ง์ ์ ํ์ํ๋ค. ์ต๋จ ์๊ฐ์ ๊ตฌํ๊ธฐ ์ํด ๋จผ์ ๊ฐ ์ง์ ์ ์๊ฐ์ Integer.MAX_VALUE๋ก ์ด๊ธฐํํ๋ค. ์์ ์ง์ ์ ์๊ฐ์ 0์ผ๋ก ์ ์ฅํ๋ค. ์ง์ ์ ์๋งํผ ๋ชจ๋ ๋๋ก์ ์ํ์ ํ์ํด ๋ณด๋ฉฐ ๊ฐ์ด ์ ๋ฐ์ดํธ๋๋์ง ํ์ธํ๋ค. ๋ง์ฝ ๊ฐ์ด ์ ๋ฐ์ดํธ๋ ๋๊ฐ (์ง์ ์ ์-1) ๋ฒ์งธ ๋ผ๋ฉด ์์ ์ฌ์ดํด์ด ๋ฐ์ํ ๊ฒ์ด๋ฏ๋ก ์ข ๋ฃํ๋ค.
์์ ์ฌ์ดํด์ด ๋ฐ์ํ๋ค๋ฉด YES๋ฅผ, ๊ทธ๋ ์ง ์๋ค๋ฉด NO๋ฅผ ์ถ๋ ฅํ๋ค.
'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 2799_๋ธ๋ผ์ธ๋ (1) | 2024.01.25 |
---|---|
[Baekjoon] 10384_ํฌ๊ทธ๋จ (0) | 2024.01.15 |
[Baekjoon] 9694_๋ฌด์์ ์๋๋๊ฐ ์๋๋ผ ๋๊ตฌ๋ฅผ ์๋๋๊ฐ ๋ฌธ์ ๋ค (1) | 2024.01.11 |
[Baekjoon] 1719_ํ๋ฐฐ (0) | 2024.01.10 |
[Baekjoon] 11779_์ต์๋น์ฉ ๊ตฌํ๊ธฐ 2 (0) | 2024.01.09 |