๊ทธ๋ํ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์๋ ๋ค์ํ ์ ๊ทผ ๋ฐฉ์์ด ์๋ค.
1. ์์ง ๋ฆฌ์คํธ
: ์์ง๋ฅผ ์ค์ฌ์ผ๋ก ๊ทธ๋ํ๋ฅผ ํํ
: ์ด์ ๊ฐฏ์๋ฅผ 2๊ฐ๋ฅผ ๋๋, 3๊ฐ๋ฅผ ๋๋์ ๋ฐ๋ผ์ ๊ฐ์ค์น๊ฐ ์ ๋ฌด๋ฅผ ํํํ ์ ์๋ค.
: ๋ฒจ๋ง ํฌ๋๋ ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ฉฐ, ๋ ธ๋ ์ค์ฌ ์๊ณ ๋ฆฌ์ฆ์๋ ์ ์ฌ์ฉํ์ง ์๋๋ค.
2. ์ธ์ ํ๋ ฌ
: ํ๊ณผ ์ด์ ๊ทธ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค.(๊ฐ๋ น, 1ํ 2์ด์ ํ์ํ๋ ๊ฒ์ 1์์ 2๋ฅผ ํฅํ๋ ์์ง๋ฅผ ๋ํ๋)
: ๊ฐ์ค์น๊ฐ ์๋ ๊ฒฝ์ฐ 1์ ์ ์ฅํ์ง๋ง, ๊ฐ์ค์น๊ฐ ์๋ค๋ฉด ๊ทธ ๊ฐ์ ์ ์ฅํ๋ค.
3. ์ธ์ ๋ฆฌ์คํธ
: ArrayList๋ก ๊ทธ๋ํ๋ฅผ ํํํ๋ค.
: ๊ฐ์ค์น๊ฐ ์๋ค๋ฉด, ArrayList<Integer>[5]์ ๊ฐ์ ์์ผ๋ก ํํํ๋ค.
: ๊ฐ์ค์น๊ฐ ์๋ค๋ฉด ๊ฐ ArrayList์ ๊ฐ์ ๋ ธ๋๋ฅผ ๋์ด ๊ฐ์ค์น ๊ฐ์ ์ ์ฅํ ์ ์๋ค.
: ๋ ธ๋ ๊ฐ์๊ฐ ์ปค๋ ๊ณต๊ฐ ํจ์จ์ด ์ข๋ค.
์ด๋ ๊ฑฐ๋ฆฌ ์ ์ฅํ๊ธฐ
BFS๋ฅผ ํตํด์ ์ด๋๊ธธ์ด๋ฅผ ์ ์ฅํ๋ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด์.
18352๋ฒ: ํน์ ๊ฑฐ๋ฆฌ์ ๋์ ์ฐพ๊ธฐ
์ฒซ์งธ ์ค์ ๋์์ ๊ฐ์ N, ๋๋ก์ ๊ฐ์ M, ๊ฑฐ๋ฆฌ ์ ๋ณด K, ์ถ๋ฐ ๋์์ ๋ฒํธ X๊ฐ ์ฃผ์ด์ง๋ค. (2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N) ๋์งธ ์ค๋ถํฐ M๊ฐ์ ์ค์ ๊ฑธ์ณ์ ๋ ๊ฐ
www.acmicpc.net
import java.nio.Buffer;
import java.util.*;
import java.io.*;
public class Main {
static int visited[];
static ArrayList<Integer>[] A;
static int N, M, K, X;
static List<Integer> answer;
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
M = sc.nextInt();
K = sc.nextInt();
X = sc.nextInt();
A = new ArrayList[N+1];
answer = new ArrayList<>();
for(int i=1; i<=N; i++) {
A[i] = new ArrayList<Integer>();
}
for(int i=0; i<M; i++) {
int S = sc.nextInt();
int E = sc.nextInt();
A[S].add(E);
}
visited = new int[N+1];
for(int i=0; i<=N; i++) {
visited[i] = -1;
}
BFS(X);
for(int i=0; i<=N; i++) {
if (visited[i] == K) {
answer.add(i);
}
}
if (answer.isEmpty()) {
System.out.println(-1);
} else {
Collections.sort(answer);
for(int temp:answer) {
System.out.println(temp);
}
}
}
private static void BFS(int Node) {
Queue<Integer> queue = new LinkedList<Integer>();
queue.add(Node);
visited[Node]++;
while(!queue.isEmpty()) {
int now_Node = queue.poll();
for(int i : A[now_Node]) {
if (visited[i] == -1) {
visited[i] = visited[now_Node] + 1;
queue.add(i);
}
}
}
}
}
- ์ด๋ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํด์ฃผ๊ธฐ ์ํด visited[i] = visited[now_Node] + 1๋ฅผ ์ ์ด์ค๋ค.
์ด๋ถ ๊ทธ๋ํ ๊ตฌํ๊ธฐ
1707๋ฒ: ์ด๋ถ ๊ทธ๋ํ
์ ๋ ฅ์ ์ฌ๋ฌ ๊ฐ์ ํ ์คํธ ์ผ์ด์ค๋ก ๊ตฌ์ฑ๋์ด ์๋๋ฐ, ์ฒซ์งธ ์ค์ ํ ์คํธ ์ผ์ด์ค์ ๊ฐ์ K๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ํ ์คํธ ์ผ์ด์ค์ ์ฒซ์งธ ์ค์๋ ๊ทธ๋ํ์ ์ ์ ์ ๊ฐ์ V์ ๊ฐ์ ์ ๊ฐ์ E๊ฐ ๋น ์นธ์ ์ฌ์ด์
www.acmicpc.net
import java.util.*;
import java.io.*;
public class Main {
static boolean[] visited;
static ArrayList<Integer>[] A;
static boolean IsEven;
static int[] check;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int k = Integer.parseInt(br.readLine());
// for(k๋งํผ ๋ฐ๋ณต)
// -> v(๋
ธ๋ ๊ฐฏ์), e(์์ง ๊ฐฏ์)
// for(v์ ๊ฐฏ์๋งํผ ๋ฐ๋ณต)
// -> ์ด๊ธฐํ
// for(e๋งํผ ๋ฐ๋ณต)
// -> ๊ทธ๋ํ ๋ฐ์ดํฐ ์ ์ฅ
for(int i=0; i<k; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int v = Integer.parseInt(st.nextToken());
int e = Integer.parseInt(st.nextToken());
A = new ArrayList[v+1];
visited = new boolean[v+1];
check = new int[v+1];
IsEven = true;
for(int j=1; j<=v; j++) {
A[j] = new ArrayList<>();
}
for(int j=0; j<e; j++) {
st = new StringTokenizer(br.readLine());
int S = Integer.parseInt(st.nextToken());
int E = Integer.parseInt(st.nextToken());
A[S].add(E);
A[E].add(S);
}
// for(v์ ๊ฐ์๋งํผ ๋ฐ๋ณต)
// -> ๊ฐ ๋
ธ๋์์ DFS ์คํ -> ์ด๋ถ ๊ทธ๋ํ๊ฐ ์๋๋ผ๋ฉด ์ข
๋ฃ
for(int j=1; j<=v; j++) {
if (IsEven) {
DFS(j);
} else {
break;
}
}
if (IsEven) {
System.out.println("YES");
} else {
System.out.println("NO");
}
}
}
// DFS๊ตฌํ
// if (ํ์ฌ ๋
ธ๋ ์ค ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋๋ก)
// -> ํ์ฌ ๋
ธ๋์ ๋ค๋ฅธ ์งํฉ์ผ๋ก ์ฐ๊ฒฐ ๋
ธ๋ ์ ์ฅ
// -> DFS์คํ
// else (๋ฐฉ๋ฌธํ ๋
ธ๋์ธ๋ฐ, ๊ฐ์ ์งํฉ์ธ ๊ฒฝ์ฐ)
// -> ์ด๋ถ ๊ทธ๋ํ๊ฐ ์๋
public static void DFS(int Node) {
visited[Node] = true;
for(int i: A[Node]) {
if (!visited[i]) {
check[i] = (check[Node] + 1) % 2;
DFS(i);
} else if (check[Node] == check[i]) {
IsEven = false;
}
}
}
}
์ธ์ ์์๊ฐ ๊ฐ์ ๊ทธ๋ฃน์ธ์ง ํ์ธํ๊ธฐ ์ํด์ check๋ผ๋ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ค.
- check[i] = (check[Node] + 1) % 2๋ฅผ ํตํด์, ์๋กญ๊ฒ ๋ฐฉ๋ฌธํ๋ ๋ฐฐ์ด์ด ์ด๋ ๊ทธ๋ฃน์ ์ํด์๋ ์ง ํ์ธ ํ ์ ์๋ค.
๊ทธ๋ํ๋ฅผ ์ญ์ผ๋ก ๊ทธ๋ฆฌ๋ ๋ฐฉ์
์ง๊ธ๊น์ง๋ ๊ทธ๋ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ ์ฅํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ์๋ค.
ํ์ง๋ง, ์ด ๋ฌธ์ ๋ ๋ฐ๋๋ก ๊ทธ๋ํ๋ฅผ ์ญ์ผ๋ก ๊ทธ๋ฆฌ๋ฉฐ ์ ๊ทผํ๋ค.
2251๋ฒ: ๋ฌผํต
๊ฐ๊ฐ ๋ถํผ๊ฐ A, B, C(1≤A, B, C≤200) ๋ฆฌํฐ์ธ ์ธ ๊ฐ์ ๋ฌผํต์ด ์๋ค. ์ฒ์์๋ ์์ ๋ ๋ฌผํต์ ๋น์ด ์๊ณ , ์ธ ๋ฒ์งธ ๋ฌผํต์ ๊ฐ๋(C ๋ฆฌํฐ) ์ฐจ ์๋ค. ์ด์ ์ด๋ค ๋ฌผํต์ ๋ค์ด์๋ ๋ฌผ์ ๋ค๋ฅธ ๋ฌผํต์ผ๋ก ์์ ๋ถ
www.acmicpc.net
import java.util.*;
import java.io.*;
public class Main {
static int[] Sender = { 0, 0, 1, 1, 2, 2 };
static int[] Receiver = { 1, 2, 0, 2, 0, 1};
static boolean visited[][];
static boolean answer[];
static int now[];
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
now = new int[3];
now[0] = sc.nextInt();
now[1] = sc.nextInt();
now[2] = sc.nextInt();
visited = new boolean[201][201];
answer = new boolean[201];
BFS();
for(int i =0; i<answer.length; i++) {
if (answer[i]) System.out.print(i + " ");
}
}
public static void BFS() {
Queue<AB> queue = new LinkedList<>();
queue.add(new AB(0, 0));
visited[0][0] = true;
answer[now[2]] = true;
while(!queue.isEmpty()) {
AB p = queue.poll();
int A = p.A;
int B = p.B;
int C = now[2] - A-B;
for(int k = 0; k<6; k++){
int[] next = { A, B, C };
next[Receiver[k]] += next[Sender[k]];
next[Sender[k]] = 0;
if (next[Receiver[k]] > now[Receiver[k]]) {
next[Sender[k]] = next[Receiver[k]] - now[Receiver[k]];
next[Receiver[k]] = now[Receiver[k]];
}
if(!visited[next[0]][next[1]]) {
visited[next[0]][next[1]] = true;
queue.add(new AB(next[0], next[1]));
if (next[0] == 0) {
answer[next[2]] = true;
}
}
}
}
}
}
class AB {
int A;
int B;
public AB (int A, int B) {
this.A = A;
this.B = B;
}
}
- Sender์ Receiver๋ฅผ ํตํด์, ์ด๋ ์ผ์ด์ค๋ฅผ ๋๋์๋ค.
- visited ๋ฐฐ์ด์ A,B๋ฌด๊ฒ๋ง ์์ผ๋ฉด ํ๋๋ ๊ณ ์ ๋๋ฏ๋ก 2์ฐจ์์ผ๋ก ๊ณ ์ ํ์๋ค.
- BFS()ํจ์ ์์ queue๋ฅผ ๊ตฌํํ์ฌ A,B ๋ฌด๊ฒ๋ฅผ ์ ์ฅํ๊ณ 6๊ฐ์ง ์ด๋ ์ผ์ด์ค๋ฅผ ๋ฐ์ ธ๊ฐ๋ฉฐ ๋ฌผ์ ์ ์ฅํ์๋ค.
- ๋ฐฉ๋ฌธ ๋ฐฐ์ด์ ์ฒดํฌํ๊ณ , ๋ถํฉํ๋ค๋ฉด A์ ๋ฌผ์ ์์ด 0์ผ ๋ ์ ๋ต ๋ณ์์ ์ ์ฅํ๋ค.
Reference
- Do it! ์ฝ๋ฉ ํ ์คํธ - ๊ธฐ๋ณธ ํธ
'๐ Knowledge > ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ์์ ์ ๋ ฌ์ ์ดํดํด๋ณด์. (1) | 2023.10.12 |
---|---|
[์๊ณ ๋ฆฌ์ฆ] ์ ๋์จ๊ณผ ํ์ธ๋ ์๊ณ ๋ฆฌ์ฆ(union, find) (0) | 2023.09.07 |
[์๊ณ ๋ฆฌ์ฆ] ์ ์๋ก - ์ค์ผ๋ฌ ํผ์ ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ (0) | 2023.09.01 |
[์๊ณ ๋ฆฌ์ฆ] ์ ์๋ก - ์์์ ๊ดํ์ฌ (0) | 2023.08.30 |
[์๊ณ ๋ฆฌ์ฆ] ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ (0) | 2023.08.28 |