728x90
728x90
00 ๋ฌธ์
01 DFS ์๊ณ ๋ฆฌ์ฆ?
- Depth First Search, ๊น์ด ์ฐ์ ํ์์ด๋ผ๋ ๋ป.
- ํ๋์ ๋ ธ๋์์ ์์ํ์ฌ ๋ง์ง๋ง ์ง์ ๊น์ง ๊ณ์ ํ์ํ๋ ํ๋์ ํ๋ ์๊ณ ๋ฆฌ์ฆ
- ์ฆ, ์์์ ์ ๊ธฐ์ค์ผ๋ก ๊ฐ์ฅ ์๋๊น์ง ์ด๋ํ๋ฉด์ ํ์ํ๋ ๋ฐฉ์ -> ์คํ์ ์ด์ฉํ์ฌ ํธ๋ ๋ฐฉ์
- ์คํ์ ๊ฐ์ ๋ฃ์ด์ฃผ๊ณ , ๊ทธ ๊ฐ์ ํตํด ํ์ธํ๋ฉฐ ์ข ๋ฃ ์กฐ๊ฑด์ ์คํ์ด ๋น์ด์์ ๋์ด๋ค.
- DFS์ ์ฅ์ ์ ๊น์ ๊ณณ์ ์์์๋ก ๋นจ๋ฆฌ ์ฐพ์๋ผ ์ ์๋ค๋ ์
- ๋จ์ ์ ์์นซํ๋ฉด overflow๊ฐ ๋ ์๋ ์๊ณ , ์ป์ด์ง ํด๊ฐ ์ต๋จ ๊ฑฐ๋ฆฌ๋ผ๋ ๋ณด์ฅ์ด ์๋ค.
02 DFS ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ ๋ฐฉ์
- ์ธ์ ํ ๋ ธ๋๋ค์ ํํํ๊ธฐ ์ํด NxN ํฌ๊ธฐ์ adj_mat ๋ฐฐ์ด๊ณผ ๋ฐฉ๋ฌธํ ๋ ธ๋๋ฅผ ํํํ๊ธฐ ์ํด Nx1 ํฌ๊ธฐ์ visited ๋ฐฐ์ด์ ์ฌ์ฉํ๋ค.
- add_matrix ํจ์์์ ์ฐ๊ฒฐ๋ ๋ ธ๋๋ฅผ ์ ๋ ฅ๋ฐ๊ณ , ํด๋น ๊ฐ์ 1๋ก ์ค์ ํ๋ค.
- Stack์ ์ด์ฉํด DFS๋ฅผ ๊ตฌํํ๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ๋ค.
- ํ์ฌ ๊ธฐ์ค์ ์ด ๋๋ ์ ์ ์ row ๋ณ์์ ์ ์ฅํ๋ค.
- ๋ฐ๋ณต์ ์ํด i ๋ณ์๋ฅผ ์ด์ฉํ๋ค. push ๋๋ pop ํ ๋ ์ด๊ธฐํ๋๋ค.
- row ์ i ๋
ธ๋๊ฐ ์ฐ๊ฒฐ๋์ด ์๊ณ i ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ์ง ์์์ ๊ฒฝ์ฐ push
- i ๋ณ์๊ฐ N๊ณผ ๊ฐ์์ง๋ฉด ์ง๋๊ฐ ๋
ธ๋๊ฐ ์๋ค๋ ๋ป์ด๋ฏ๋ก pop
- ๋ชจ๋ ๋
ธ๋๋ฅผ popํด์ stack์ด ๋น์ด์์ผ๋ฉด ์ข
๋ฃํ๋ค.
bool *adj_mat, *visited;
N += 1; // ์ ์ ์ ๋ฒํธ๋ 1๋ถํฐ ์์ํ๋ค.
adj_mat = (bool *)calloc(N*N, sizeof(bool));
visited = (bool *)calloc(N, sizeof(bool));
void add_matrix(int N, int M)
{
int i;
int v1, v2;
// input
for (i = 0; i < M; i++)
{
scanf_s("%d %d", &v1, &v2);
adj_mat[v1*N + v2] = 1;
adj_mat[v2*N + v1] = 1;
}
}
void depth_first_search(int N, int V)
{
int i = 0;
int row = V;
printf("%d ", push(V));
while (is_empty())
{
visited[row] = 1;
if (adj_mat[row*N + i] == 1 && !visited[i])
{
printf("%d ", push(i));
row = i;
i = 0;
}
if (i == N)
{
pop();
row = top();
i = 0;
}
i++;
}
}
03 BFS ์๊ณ ๋ฆฌ์ฆ?
- Breadth First Search, ๋๋น ์ฐ์ ํ์์ด๋ผ๋ ๋ป.
- ์์์ ์ ๊ธฐ์ค์ผ๋ก DFS์ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ์ฅ ์๋๊น์ง ์ด๋ํ๋ฉด์ ํ์ -> ํ๋ฅผ ์ด์ฉํ๋ ๋ฐฉ์
- BFS๋ ๊น์ด ํ์๊ณผ ๋ค๋ฅด๊ฒ ์ธ์ ํ ๋ ธ๋๋ฅผ ์ฐจ๋ก๋๋ก ๋ฐฉ๋ฌธํ๋ค.
- ํ์ ๊ฐ์ ๋ฃ์ด์ฃผ๊ณ , ๊ทธ ๊ฐ์ ํตํด ํ์ธํ๋ฉฐ ์ข ๋ฃ ์กฐ๊ฑด์ ํ๊ฐ ๋น์ด์์ ๋์ด๋ค.
04 BFS ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ ๋ฐฉ์
- ์ธ์ ํ ๋ ธ๋๋ค์ ํํํ๊ธฐ ์ํด NxN ํฌ๊ธฐ์ adj_mat ๋ฐฐ์ด๊ณผ ๋ฐฉ๋ฌธํ ๋ ธ๋๋ฅผ ํํํ๊ธฐ ์ํด Nx1 ํฌ๊ธฐ์ visited ๋ฐฐ์ด์ ์ฌ์ฉํ๋ค.
- add_matrix ํจ์์์ ์ฐ๊ฒฐ๋ ๋ ธ๋๋ฅผ ์ ๋ ฅ๋ฐ๊ณ , ํด๋น ๊ฐ์ 1๋ก ์ค์ ํ๋ค.
- Queue๋ฅผ ์ด์ฉํด BFS๋ฅผ ๊ตฌํํ๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ๋ค.1) queue์ ๊ฐ์ฅ ์์ ์๋ ๋ ธ๋๋ฅผ get2) ํ์ฌ ๋ ธ๋์ ์ธ์ ํ ๋ชจ๋ ๋ ธ๋๋ค ์ค ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ค์ queue์ put3) queue๊ฐ ๋น์ด์์ง ์์ผ๋ฉด 1)๋ถํฐ ๋ค์ ์คํ
void breath_first_search(int N, int V)
{
int i = 0;
int row = V - 1;
printf("%d ", put(V));
while (is_empty())
{
visited[row] = 1;
get();
for (i = 0; i < N; ++i)
{
if (adj_mat[row*N + i] == 1 && !visited[i])
{
printf("%d ", put(i));
visited[i] = 1;
}
}
row = top();
}
}
05 ์ ์ฒด ์์ค ์ฝ๋
#include "stdafx.h"
#include "data_structure.h"
void add_matrix(int N, int M);
void print_matrix(bool* matrix, int N);
void depth_first_search(int N, int V);
void breath_first_search(int N, int V);
bool *adj_mat, *visited;
int main()
{
int i, N, M, V;
scanf_s("%d %d %d", &N, &M, &V);
N += 1; // ์ ์ ์ ๋ฒํธ๋ 1๋ถํฐ ์์ํ๋ค.
adj_mat = (bool *)calloc(N*N, sizeof(bool));
visited = (bool *)calloc(N, sizeof(bool));
init_node();
add_matrix(N, M);
//print_matrix(adj_mat, N);
printf("- - - - - - - \n");
depth_first_search(N, V);
clear_node();
for (i = 0; i < N; ++i)
visited[i] = 0;
printf("\n");
breath_first_search(N, V);
printf("\n");
// finish
free(adj_mat);
free(visited);
return 0;
}
void add_matrix(int N, int M)
{
int i;
int v1, v2;
// input
for (i = 0; i < M; i++)
{
scanf_s("%d %d", &v1, &v2);
adj_mat[v1*N + v2] = 1;
adj_mat[v2*N + v1] = 1;
}
}
void print_matrix(bool* matrix, int N)
{
int i, j;
// print
for (i = 0; i < N; ++i)
{
printf("row %d = ", i);
for (j = 0; j < N; ++j)
{
printf("%d ", matrix[i*N + j]);
}
printf("\n");
}
}
void depth_first_search(int N, int V)
{
int i = 0;
int row = V;
printf("%d ", push(V));
while (is_empty())
{
visited[row] = 1;
if (adj_mat[row*N + i] == 1 && !visited[i])
{
printf("%d ", push(i));
row = i;
i = 0;
}
if (i == N)
{
pop();
row = top();
i = 0;
}
i++;
}
}
void breath_first_search(int N, int V)
{
int i = 0;
int row = V;
printf("%d ", put(V));
while (is_empty())
{
visited[row] = 1;
if (top() == row)
get();
for (i = 0; i < N; ++i)
{
if (adj_mat[row*N + i] == 1 && !visited[i])
{
printf("%d ", put(i));
visited[i] = 1;
}
}
row = top();
}
}
06 data_structer header
#include <stdlib.h>
typedef struct _dnode {
int key;
struct _dnode *prev;
struct _dnode *next;
}dnode;
dnode *head, *tail;
void init_node()
{
head = (dnode *)calloc(1, sizeof(dnode));
tail = (dnode *)calloc(1, sizeof(dnode));
head->prev = head;
head->next = tail;
tail->prev = head;
tail->next = tail;
}
/* * * * * * * * * * * * *
** Stack push and pop * *
** * * * * * * * * * * * */
int push(int k)
{
dnode *t;
if ((t = (dnode *)malloc(sizeof(dnode))) == NULL)
{
printf("Out of memory !\n");
return -1;
}
t->key = k;
head->next->prev = t;
t->next = head->next;
t->prev = head;
head->next = t;
return k;
}
int pop()
{
dnode *t;
int k;
if (head->next == tail)
{
printf("Stack underflow !\n");
return -1;
}
t = head->next;
k = t->key;
head->next = t->next;
t->next->prev = head;
free(t);
return k;
}
/* * * * * * * * * * * * *
** Queue put and get * *
** * * * * * * * * * * * */
int put(int k)
{
dnode *t;
if ((t = (dnode*)malloc(sizeof(dnode))) == NULL)
{
printf("Out of memory !! \n");
return -1;
}
t->key = k;
tail->prev->next = t;
t->prev = tail->prev;
tail->prev = t;
t->next = tail;
return k;
}
int get()
{
dnode *t;
int k;
t = head->next;
if (t == tail)
{
printf("Queue undeflow !! \n");
return -1;
}
k = t->key;
head->next = t->next;
t->next->prev = head;
free(t);
return k;
}
void clear_node()
{
dnode *t, *s;
t = head->next;
while (t != tail)
{
s = t;
t = t->next;
free(s);
}
head->next = tail;
tail->prev = head;
}
void print_node()
{
dnode *t;
t = head->next;
while (t != tail)
{
printf("%-6d", t->key);
t = t->next;
}
}
int is_empty()
{
if (head->next == tail)
{
//printf("Linked list is empty !\n");
return 0;
}
return 1;
}
int top()
{
dnode *t;
t = head->next;
if (t == tail)
return -1;
return t->key;
}
int bottom()
{
dnode *t;
t = tail->prev;
if (t == head)
return -1;
return t->key;
}
int is_in_stack(int k)
{
dnode *t;
t = head->next;
while (t != tail)
{
if (t->key == k)
return 1;
t = t->next;
}
return 0;
}
99 ์ฐธ๊ณ ์๋ฃ
- [๋ฐฑ์ค ์๊ณ ๋ฆฌ์ฆ 1260๋ฒ: DFS์ BFS] https://www.acmicpc.net/problem/1260
- [DFS ์๊ณ ๋ฆฌ์ฆ] http://www.crocus.co.kr/520
- [BFS ์๊ณ ๋ฆฌ์ฆ] http://www.crocus.co.kr/521
- [BFS ์๊ณ ๋ฆฌ์ฆ] http://sarah950716.tistory.com/13
728x90
728x90
'๐ Algorithm > ์๊ณ ๋ฆฌ์ฆ-Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] Day3 - 1967๋ฒ ํธ๋ฆฌ์ ์ง๋ฆ (0) | 2018.08.08 |
---|---|
[์๊ณ ๋ฆฌ์ฆ] Day3 - 2309๋ฒ ์ผ๊ณฑ ๋์์ด (0) | 2018.08.08 |
[์๊ณ ๋ฆฌ์ฆ] Day2 - 2750๋ฒ ์ ์ ๋ ฌํ๊ธฐ (0) | 2018.08.04 |
[์๊ณ ๋ฆฌ์ฆ] Day2 - 2775๋ฒ ๋ถ๋ ํ์ฅ์ด ๋ ํ ์ผ (0) | 2018.08.04 |
[์๊ณ ๋ฆฌ์ฆ] Day1 - ๊ดํธ (0) | 2018.08.04 |