๋ฌธ์ (์ถ์ฒ: https://www.acmicpc.net/problem/14217)
< ๊ทธ๋ํ ํ์ >
๋ฌธ์ ํ์ด
1. ๊ฐ ๋์ -> ์๋๋ก ํ์ํ๋ ๋ฐฉ๋ฒ
: ์๊ฐ์ด๊ณผ๋ ๋ฐ์ํ์ง ์์์ง๋ง ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
2. ์๋ -> ๊ฐ ๋์ ํ์ํ๋ ๋ฐฉ๋ฒ
: bfs๋ฅผ ํ ๋ฒ๋ง ํธ์ถํ์ฌ ๋ต์ ์ป์ ์ ์์ด 1๋ฒ๋ณด๋ค ์๊ฐ์ด ์ ๊ฒ ๊ฑธ๋ฆฌ๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
์์ ๊ฐ์ ๋ฐฉ๋ฒ ๋ง๊ณ ๋ ๋จ์ bfs๋ฅผ ํ์ฉํ๋ฉด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์๋ค.
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.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static ArrayList<ArrayList<Integer>> arr;
static boolean visited[];
static int result[];
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=new StringTokenizer(bf.readLine());
int n=Integer.parseInt(st.nextToken());
int m=Integer.parseInt(st.nextToken());
// init
arr=new ArrayList<>();
for(int i=0; i<n; i++) {
arr.add(new ArrayList<>());
}
for(int i=0; i<m; i++) { // ์๋ฐฉํฅ
st=new StringTokenizer(bf.readLine());
int a=Integer.parseInt(st.nextToken())-1;
int b=Integer.parseInt(st.nextToken())-1;
arr.get(a).add(b);
arr.get(b).add(a);
}
int q=Integer.parseInt(bf.readLine());
for(int k=0; k<q; k++) {
st=new StringTokenizer(bf.readLine());
int a=Integer.parseInt(st.nextToken());
int i=Integer.parseInt(st.nextToken())-1;
int j=Integer.parseInt(st.nextToken())-1;
if(a==1) { // ๋๋ก ์์ฑ
arr.get(i).add(j);
arr.get(j).add(i);
}else { // ๋๋ก ์ ๊ฑฐ
arr.get(i).remove(Integer.valueOf(j));
arr.get(j).remove(Integer.valueOf(i));
}
visited=new boolean[n];
result=new int[n];
bfs(0,0);
for(int l=0; l<n; l++) {
if(!visited[l]) bw.write("-1 ");
else bw.write(result[l]+" ");
}
bw.write("\n");
}
bw.flush();
}
private static void bfs(int start, int depth) {
Queue<int[]> queue=new LinkedList<>();
queue.add(new int[] {start, depth});
visited[start]=true;
while(!queue.isEmpty()) {
int num[]=queue.poll();
for(int i=0; i<arr.get(num[0]).size(); i++) {
int temp=arr.get(num[0]).get(i);
if(!visited[temp]) {
visited[temp]=true;
result[temp]=num[1]+1;
queue.add(new int[] {temp, num[1]+1});
}
}
}
}
}
Main
- n(๋์์ ๊ฐ์), m(๋๋ก์ ๊ฐ์) ์ ๋ ฅ
- arr : ๋์ ์ ๋ณด ์ ์ฅ
- q(๋๋ก ์ ๋น ๊ณํ์ ๋ค์ด์๋ ๋๋ก์ ์ ) ์ ๋ ฅ ๋ฐ a, i, j ์ ๋ ฅ
- visited : ๋ฐฉ๋ฌธ ์ฌ๋ถ
- result: ์ต์ ๋ฐฉ๋ฌธ ๋์ ์ ์ฅ
- bfs๋ฅผ ํ์ฉํ์ฌ ์๋์์ ๋ค๋ฅธ ๋์ ๋ฐฉ๋ฌธ ํ ๊ฐ์ ์ถ๋ ฅ
bfs
- queue์ {๋์ ๋ฒํธ, ๋ฐฉ๋ฌธ ์} ์ ์ฅ
- queue๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณตํ๋ฉฐ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ํ์ฉํ์ฌ ์ฐ๊ฒฐ๋ ๋์๋ฅผ ํ์ธ -> ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ๊ณณ์ด๋ผ๋ฉด ์ด๋ํ์ฌ ๋ฐฉ๋ฌธ ํ result์ ( ๋ฐฉ๋ฌธ ์ + 1 ) ๊ฐ์ ์ ์ฅ ๋ฐ queue์ ์ ์ฅํด ์ค๋ค.
์๊ฐ๐ค
๋ฌธ์ ํ์ด์์ ๋งํ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ๋ดค๋ค. ์๊ฐ ์ฐจ์ด๊ฐ ๋๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 14719_๋น๋ฌผ (0) | 2023.05.29 |
---|---|
[Baekjoon] 16509_์ฅ๊ตฐ (1) | 2023.05.28 |
[Baekjoon] 1937_์์ฌ์์ด ํ๋ค (1) | 2023.05.25 |
[Baekjoon] 16954_์์ง์ด๋ ๋ฏธ๋ก ํ์ถ (0) | 2023.05.24 |
[Baekjoon] 2665_๋ฏธ๋ก๋ง๋ค๊ธฐ (0) | 2023.05.23 |