2023. 11. 30. 14:23ใ์ธํ๋ฐ/์๋ฐ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด ์ ๋ฌธ : ์ฝ๋ฉํ ์คํธ ๋๋น
https://hyejin.tistory.com/1264
-> ์ด์ ๋ฌธ์ ํ์ด
13. ๊ทธ๋ํ ์ต๋จ๊ฑฐ๋ฆฌ (BFS)
์ค๋ช
๋ค์ ๊ทธ๋ํ์์ 1๋ฒ ์ ์ ์์ ๊ฐ ์ ์ ์ผ๋ก ๊ฐ๋ ์ต์ ์ด๋ ๊ฐ์ ์๋ฅผ ์ถ๋ ฅํ์ธ์.
์ ๋ ฅ ์ค๋ช
์ฒซ์งธ ์ค์๋ ์ ์ ์ ์ N(1<=N<=20)์ ๊ฐ์ ์ ์ M๊ฐ ์ฃผ์ด์ง๋ค.
๊ทธ ๋ค์๋ถํฐ M์ค์ ๊ฑธ์ณ ์ฐ ๊ฒฐ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ ์ค๋ช
1๋ฒ ์ ์ ์์ ๊ฐ ์ ์ ์ผ๋ก ๊ฐ๋ ์ต์ ๊ฐ์ ์๋ฅผ 2๋ฒ ์ ์ ๋ถํฐ ์ฐจ๋ก๋๋ก ์ถ๋ ฅํ์ธ์.
์ ๋ ฅ ์์ 1
6 9
1 3
1 4
2 1
2 5
3 4
4 5
4 6
6 2
6 5
์ถ๋ ฅ ์์ 1
2 : 3
3 : 1
4 : 1
5 : 2
6 : 2
๋ฌธ์ ํ์ด 1
public class GraphShortestDistance
{
static int n, m = 0;
static ArrayList<ArrayList<Integer>> graph;
Queue<Integer> Q = new LinkedList<>();
public int BFS(int v)
{
int L = 0; // root node level
Q.offer(1);
while (!Q.isEmpty())
{
int len = Q.size();
for (int i = 0; i < len; i++)
{
int cur = Q.poll();
if (cur == v) {
return L;
}else {
for (int nv : graph.get(cur))
{
if (nv == v) {
Q = new LinkedList<>();
return L + 1;
}
Q.offer(nv);
}
}
}
L++;
}
return L;
}
public static void main(String[] args)
{
GraphShortestDistance graphShortestDistance = new GraphShortestDistance();
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
m = scanner.nextInt();
graph = new ArrayList<>();
for (int i = 0; i <= n; i++)
{
graph.add(new ArrayList<>());
}
for (int i = 0; i < m; i++)
{
int a = scanner.nextInt();
int b = scanner.nextInt();
graph.get(a).add(b);
}
for (int i = 2; i<= n; i++)
{
int result = graphShortestDistance.BFS(i);
System.out.println(i + " : " + result);
}
}
}
๐ฉ๐ป: ์์ ํ์ด๋ ๋ด๊ฐ ํผ ํ์ด์ธ๋ฐ ๋๋ BFS ๋ก ํผ๋ค๊ณ ํ๋ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ level๋ก ์๊ฐํด์ ํ์๋ค.
-> ์ด๋ฐ์์ผ๋ก 1๋ฒ ์ ์ ์์ ์์ํด์ 2๋ฒ ์ ์ ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ ๊ตฌํ๊ณ ,
1๋ฒ ์ ์ ์์ ์์ํด์ 3๋ฒ์ ์ ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ ๊ตฌํ๊ณ ...
1๏ธโฃ
static int n, m = 0;
static ArrayList<ArrayList<Integer>> graph;
Queue<Integer> Q = new LinkedList<>();
๊ทธ๋์ ๋จผ์ n์๋ ์ ๋ ฅ๋ฐ์ ์ ์ ์ ์๋ฅผ ์ ์ฅํ๊ณ , m์๋ ์ ๋ ฅ๋ฐ์ ๊ฐ์ ์ ์๋ฅผ ์ ์ฅํด์คฌ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฒ์๋ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํด์ ๋ฌธ์ ๋ฅผ ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ Arraylist<Integer> ๋ฅผ ์ ์ฅํ๋ Arraylist๋ฅผ ๋ง๋ค์ด์คฌ๋ค.
BFS ๋ฌธ์ ๋ฅผ ํ ๋๋ Queue๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ Q๋ ์ ์ธํด์คฌ๋ค.
(๊ทผ๋ฐ BFS ๋ฅผ ํผ๋ค๋ฉด ๋ฌด์กฐ๊ฑด Queue๋ฅผ ์ฌ์ฉํ๋์ง๋ ์์ง ๋ชจ๋ฅด๊ฒ ๋ค.)
1๏ธโฃ
for (int i = 0; i <= n; i++)
{
graph.add(new ArrayList<>());
}
for (int i = 0; i < m; i++)
{
int a = scanner.nextInt();
int b = scanner.nextInt();
graph.get(a).add(b);
}
-> ๊ทธ ๋ค์์๋ graph์ n + 1 ๊ฐ ๋งํผ Arraylist<Integer>๋ฅผ ๋ง๋ค์ด์ค์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ณต๋ฌธ์ n+1๋งํผ ๋๋ฉด์ ๋ฆฌ์คํธ๋ฅผ ์์ฑํด์ค๋ค.
๊ทธ๋ฆฌ๊ณ m ๋งํผ ๋ฐ๋ณต๋ฌธ ๋๋ฉด์ graph์ ์ ์ฅ์ ํด์ฃผ๊ณ ,
for (int i = 2; i<= n; i++)
{
int result = graphShortestDistance.BFS(i);
System.out.println(i + " : " + result);
}
BFS๋ฅผ 2 ๋ถํฐ n๊น์ง ๋๋ฉด์ BFS ๋ฉ์๋๋ฅผ ํธ์ถํด์ ๋ฐ์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅํ๋๋ก ํ๋ค.
2๏ธโฃ
public int BFS(int v)
{
int L = 0; // root node level
Q.offer(1);
while (!Q.isEmpty())
{
int len = Q.size();
for (int i = 0; i < len; i++)
{
int cur = Q.poll();
if (cur == v) {
return L;
}else {
for (int nv : graph.get(cur))
{
if (nv == v) {
Q = new LinkedList<>();
return L + 1;
}
Q.offer(nv);
}
}
}
L++;
}
return L;
}
์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๋ ๋ฒจ๋ก ๊ตฌํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋จผ์ L ๋ณ์๋ฅผ 0์ผ๋ก ์ด๊ธฐํ ํด์ฃผ๊ณ , Q ์ 1 ๊ฐ์ ๋จผ์ offer ํด์ค๋ค. (๋ฌธ์ ๊ฐ 1๋ฒ ์ ์ ์์ ๋ค๋ฅธ ์ ์ ์ผ๋ก์ ์ต๋จ ๊ฑฐ๋ฆฌ์ด๋ฏ๋ก ์์์ ๋ฌด์กฐ๊ฑด 1๋ฒ ์ ์ ์)
๊ทธ๋ฆฌ๊ณ ์ด์ while๋ฌธ์ queue ๊ฐ ๋น์ด์์ง ์์ ๋๊น์ง ์ํํด์ฃผ๋ฉด ๋๋ค.
Q์ ์ฌ์ด์ฆ๋ฅผ len ์ด๋ผ๋ ๋ณ์์ ์ ์ฅํด์ฃผ๊ณ , (๋ ๋ฒจ L์ ํด๋นํ๋ ์ ์ ๋ ธ๋์ ๊ฐ์)
for๋ฌธ์ ํตํด len ๋งํผ ๋๋ฉด์ Q ๋ฅผ ๊บผ๋ด๋๋ฐ cur ๊ฐ์ด v์ ๊ฐ๋ค๋ฉด (์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๊ณ ์ ํ๋ ์ ์ ๊ณผ ๊ฐ๋ค๋ฉด) ๊ทธ ์๋ฆฌ์์ return L ํด์ฃผ๋ฉด ๋๊ณ , ์๋๋ผ๋ฉด graph์์ ์ด์ cur ๊ฐ์ ๊บผ๋ด์(์ด์ ๋ ๋ฒจ ํ๋ +1๋๋ ๊ฑฐ์) nv๊ฐ v ๊ฐ ๊ฐ์์ง ํ์ธํ๋ค.
๋ง์ฝ ๊ฐ์ผ๋ฉด L +1 ํด์ ๋ฆฌํดํด์ฃผ๋๋ฐ ์ด๋ Q ์ ๋จ์์๋ ๊ฐ์ด ์์ผ๋ฉด ๋ค์ 1๋ฒ ์ ์ ๋ถํฐ์ ์ต๋จ ๊ฑฐ๋ฆฌ ๊ตฌํ ๋ ๋น Q ๊ฐ ์๋๊ฒ ๋๋ฏ๋ก Q ๋ฅผ ๋ค์ ์ด๊ธฐํํด์ค๋ค.
nv๊ฐ v๊ฐ ์๋๋ผ๋ฉด ๊ทธ๋ฅ Q ์ offer ํด์ฃผ๋ฉด ๋๋ค.
๊ฐ์ ๋ ๋ฒจ์ ๋ค์ด์๋ Q๋ฅผ ๋ชจ๋ ๊บผ๋๋ค๋ฉด ๋ฐ๋ณต๋ฌธ์ ์ข ๋ฃํ๊ณ L ++ ํด์ ๋ค์ ๋ ๋ฒจ๋ก ๋์ด๊ฐ๋ฉด ๋๋ค.
-> ์ด๋ฐ์์ผ๋ก ํด์ 1๋ฒ ์ ์ ์์ 2๋ฒ ์ ์ ์ผ๋ก ๊ฐ๋ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ ๊ฒ์ด๊ณ ,
3๋ฒ, 4๋ฒ, 5๋ฒ, 6๋ฒ ์ ์ ๋ ๋์ผํ๊ฒ ์ํํด์ฃผ๋ฉด ๋๋ค.
๐ ๊ทผ๋ฐ ๋ด๊ฐ ํผ ๋ฌธ์ ๋ ๊ฐ๋ ๋ ธ๋๋ฅผ ํ์ธ์ํด์ ๋์ผํ ๋ ธ๋๋ฅผ ๋ ๋ฐฉ๋ฌธํ๊ณ ์๋ค..!
์ด ๋ถ๋ถ์ ์์ ํด์ ํ์ด์ผํ ๋ฏ ํ๋ค.. .
๋ฌธ์ ํ์ด 2
public class GraphShortestDistance2
{
static int n, m;
static ArrayList<ArrayList<Integer>> graph;
static int[] ch, dis;
public void BFS(int v)
{
Queue<Integer> queue = new LinkedList<>();
ch[v] = 1;
dis[v] = 0;
queue.offer(v);
while (!queue.isEmpty())
{
int cv = queue.poll();
for (int nv : graph.get(cv))
{
if (ch[nv] == 0) { // ๋ฐฉ๋ฌธ ์ํ๋๊ฐ ?
ch[nv] = 1;
queue.offer(nv);
dis[nv] = dis[cv] + 1;
}
}
}
}
public static void main(String[] args)
{
GraphShortestDistance2 graphShortestDistance2 = new GraphShortestDistance2();
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
m = scanner.nextInt();
graph = new ArrayList<>();
for (int i = 0; i <= n; i++)
{
graph.add(new ArrayList<>());
}
ch = new int[n + 1];
dis = new int[n + 1];
for (int i = 0; i < m; i++)
{
int a = scanner.nextInt();
int b = scanner.nextInt();
graph.get(a).add(b);
}
graphShortestDistance2.BFS(1);
for (int i = 2; i<= n; i++)
{
System.out.println(i + " : " + dis[i]);
}
}
}
๐พ : ๊ฐ์ฌ๋์ ๋ ๋ฒจ๋ก ๋ฌธ์ ๋ฅผ ํ์ง ์๊ณ ๋ฐฐ์ด์ ์ฌ์ฉํด์ ๋ฌธ์ ๋ฅผ ์์ !!! ๊ฐ๋จํ๊ฒ ํธ์ จ๋ค..
(๋ฐ์ ๊ทธ๋ฆผ์ ๊ฐ์ ๋ณด๊ณ ๋ด๊ฐ ์บก์ณํ ๊ทธ๋ฆผ)
๋จผ์ dis ๋ผ๋ ๋ฐฐ์ด์ ํ๋ n+1 ๋ก ๋ง๋ค์ด์ ๊ฐ๊ฐ์๋ 1๋ฒ ์ ์ ์์ ํด๋น ์ธ๋ฑ์ค ์ ์ ์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ๋ค.
ex) dis[3]์ ์๋ฏธ๋ 1๋ฒ ์ ์ ์์ 3๋ฒ ์ ์ ์ผ๋ก ๊ฐ๋ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์๋ฏธํ๋ค.
1๋ฒ ์ ์ ์์ 3๋ฒ, 4๋ฒ ์ ์ ์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ 1์ด๋ฏ๋ก 1์ ์ ์ฅํด์ค๋ค.
dis[3] = dis[1] + 1
dis[4] = dis[1] + 1
nv ๋ v์ ์ฐ๊ฒฐ๋ ๋ค์ ๋ ธ๋ (์ ์ )์ ๋งํ๋ค.
๊ทธ๋ฆฌ๊ณ v์๋ ํ์ฌ ๋ ธ๋์ด๋ค.
-> 1๋ฒ ์ ์ ์์ ๊ฐ ์ ์๋ ์ ์ ๋ค์ ๊ธธ์ด๋ฅผ ๋ฐ์ ๊ณต์์ผ๋ก ํด์ ๊ตฌํ ์ ์๋ค.
dis[nv] = dis[v] + 1
๊ทธ๋ผ ์ด์ 3๋ฒ ๋ ธ๋ ๋จผ์ ๋ณด๋ฉด 3๋ฒ ๋ ธ๋๋ 4๋ฒ ๋ ธ๋๋ก ํฅํ๋๋ฐ 4๋ฒ ๋ ธ๋๋ ์ด๋ฏธ ๋ฐฉ๋ฌธ ์ค์ด๊ธฐ ๋๋ฌธ์ ํจ์คํ๋ค.
๋ค์ 4๋ฒ ๋ ธ๋๋ 5๋ฒ, 6๋ฒ ๋ ธ๋์ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฏ๋ก
dis[5] = dis[4] + 1;
dis[6] = dis[4] + 1; ํด์ฃผ๋ฉด ๋๋ค.
๋ง์ง๋ง์ผ๋ก 5๋ฒ ๋ ธ๋๋ ์ฐ๊ฒฐ๋ ์ ์ ์ด ์์ผ๋ฏ๋ก ๋์ด๊ฐ๊ณ , 6๋ฒ ๋ ธ๋๋ 2๋ฒ, 5๋ฒ ๋ ธ๋๋ก ํฅํ๋๋ฐ
5๋ฒ ๋ ธ๋๋ ์ด๋ฏธ ๋ฐฉ๋ฌธ ์ค์ด๋ฏ๋ก ๋์ด๊ฐ๊ณ , 2๋ฒ ๋ ธ๋๋ก ๊ฐ๋ค.
dis[2] = dis[5] + 1;
์ด๋ ๊ฒ ํ๋ฉด 1๋ฒ ๋ ธ๋์์ ๊ฐ ๋ ธ๋ ์ ์ ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ dis ๋ฐฐ์ด์ ์ป๊ฒ ๋๊ณ ,
์ด ๋ฐฐ์ด์ ๋ฉ์ธ์์ ๋ฐ๋ณต๋ฌธ์ ํตํด ์ถ๋ ฅํด์ฃผ๋ฉด ๋๋ค.
0๏ธโฃ
static int n, m;
static ArrayList<ArrayList<Integer>> graph;
static int[] ch, dis;
n, m, graph๋ ๋์ ๋์ผํ๊ณ , ๊ฐ์ฌ๋์ ch, dis static int ๋ฐฐ์ด์ ๋ง๋ค์ด์คฌ๋ค.
1๏ธโฃ
for (int i = 0; i <= n; i++)
{
graph.add(new ArrayList<>());
}
ch = new int[n + 1];
dis = new int[n + 1];
for (int i = 0; i < m; i++)
{
int a = scanner.nextInt();
int b = scanner.nextInt();
graph.get(a).add(b);
}
graphShortestDistance2.BFS(1);
for (int i = 2; i<= n; i++)
{
System.out.println(i + " : " + dis[i]);
}
๊ทธ๋ฆฌ๊ณ main ๋ฉ์๋์์ ์ ๋ ฅ๋ฐ์ n์ ํตํด ch์ dis ๋ฐฐ์ด์ n+1๋ก ์ด๊ธฐํํด์ค๋ค. (์ธ๋ฑ์ค 0์ ๋์ด๊ฐ๊ธฐ ์ํด์)
BFS ๋ฉ์๋๋ฅผ 1๋ก ์ง์ ํด์ dis ๋ฐฐ์ด์ 1๋ฒ ์ ์ ์์ ๋ค๋ฅธ ์ ์ ์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ๊ณ ,
์ด ๋ฐฐ์ด์ for๋ฌธ์ ํตํด ์ถ๋ ฅ ์์์ ๋ง๊ฒ ์ถ๋ ฅํด์ฃผ๋ฉด ๋๋ค.
2๏ธโฃ
public void BFS(int v)
{
Queue<Integer> queue = new LinkedList<>();
ch[v] = 1;
dis[v] = 0;
queue.offer(v);
while (!queue.isEmpty())
{
int cv = queue.poll();
for (int nv : graph.get(cv))
{
if (ch[nv] == 0) { // ๋ฐฉ๋ฌธ ์ํ๋๊ฐ ?
ch[nv] = 1;
queue.offer(nv);
dis[nv] = dis[cv] + 1;
}
}
}
}
๊ทธ๋ฆฌ๊ณ BFS ๋๋น ์ฐ์ ํ์์ผ๋ก ํ๊ธฐ ์ํ Queue๋ฅผ ์ ์ธํด์ฃผ๊ณ , ch[v] ์ฆ ch[1] = 1, dis[1] = 0 ์ผ๋ก ์ด๊ธฐํํด์ค๋ค.
dis[1]์ 0์ผ๋ก ํ๋ ์ด์ ๋ 1๋ฒ ๋ ธ๋ ์์ ์ด๊ธฐ ๋๋ฌธ์ ๊ฑฐ๋ฆฌ๋ 0์ด๋ค!
๋ค์ queue์ 1 ๋ ธ๋๋ฅผ offer ํด์ค๋ค.
while๋ฌธ์ queue๊ฐ ๋น์ด์์ง ์์๋๊น์ง ๋ฐ๋ณตํด์ ์ํํด์ค๋ค.
queue์์ ๊บผ๋ธ ํ์ฌ ๋ ธ๋๋ฅผ cv๋ผ๊ณ ํ๊ณ ,
cv์ ๋ ธ๋์์ ๊ฐ ์ ์๋ ๋ ธ๋๋ฅผ ์๊ธฐ ์ํด์ graph์์ getํด์ ๋ ธ๋๋ค์ ๋ฐ๋ณต๋ฌธ์ ํตํด ๊บผ๋ธ๋ค.
์ด๋ cv์์ ๋ค์๊ฐ nv๊ฐ ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋์ด๋ฉด (ch[nv] == 0) ch[nv]๋ฅผ 1๋ก ๋ณ๊ฒฝํด์ฃผ๊ณ , queue์ offer ํด์ค๋ค.
๊ทธ๋ฆฌ๊ณ dis[nv]์ dis[cv] + 1 ๊ฐ์ ์ ์ฅํด์ค๋ค.