๐ก ์ด๋ฒ์๋ ๊น์ด ์ฐ์ ํ์์ ๊ตฌํ ํ๋ ๋ฒ์ ๋ฐฐ์๋ณด์๋ค.
๋ฌธ์
๐ก ๊น์ด ์ฐ์ ํ์์ ๊ตฌํํ์์ค.
๋น์ฐํ ์๋ ๋ฌธ์ ๊ธฐ์ ๋์ถฉ ๋ด๊ฐ ๋ง๋ค์๋ค.
ํด๋ต
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 1001
typedef struct Node {
int index;
struct Node *next;
} Node;
Node** a;
int n, m, c[MAX_SIZE];
void addFront(Node *root, int index) {
Node *node = (Node*) malloc(sizeof(Node));
node->index = index;
node->next = root->next;
root->next = node;
}
void dfs(int x) {
if (c[x]) {
return ;
}
c[x] = 1;
printf("%d", x);
Node *cur = a[x]->next;
while (cur != NULL) {
int next = cur->index;
dfs(next);
cur = cur->next;
}
}
int main(void) {
scanf("%d %d", &n, &m);
a = (Node**)malloc(sizeof(Node*) * (MAX_SIZE));
for (int i = 1 ; i <= n ; i++) {
a[i] = (Node*)malloc(sizeof(Node));
a[i]->next = NULL;
}
for (int i = 0 ; i < m ; i++) {
int x, y;
scanf("%d %d", &x, &y);
addFront(a[x], y);
addFront(a[y], x);
}
dfs(1);
return 0;
}
์ค๋ช
๊น์ด ์ฐ์ ํ์์ด๋?
- ํ์์ ํจ์ ์์ด์ ๊น์ ๊ฒ์ ์ฐ์ ์ผ๋ก ํ์ฌ ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- ๋น ๋ฅด๊ฒ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ํ์ํ๊ณ ์ ํ ๋ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
- ์คํ(Stack) ์๋ฃ๊ตฌ์กฐ์ ๊ธฐ์ดํ๋ค.
- ๊น์ด ์ฐ์ ํ์์ ๐(๐)์ ์๊ฐ์ด ์์๋๋ค.
- ํ์ ์์ ๋ ธ๋๋ฅผ ์คํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- ์คํ์ ์ต์๋จ ๋ ธ๋์๊ฒ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ํ๋๋ผ๋ ์์ผ๋ฉด ๊ทธ ๋ ธ๋๋ฅผ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์์ผ๋ฉด ์คํ์์ ์ต์๋จ ๋ ธ๋๋ฅผ ๊บผ๋ธ๋ค.
- 2-3๋ฒ์ ๊ณผ์ ์ ๋ ์ด์ ์ํํ ์ ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
ํจ์คํธ ์บ ํผ์ค
- ๋ฐฉ๋ฌธ ๋ฐ ๋
ธ๋ ๊บผ๋ ์ฒ๋ฆฌ๋ ์๋์ ๊ฐ๋ค
- 1 ๋ฐฉ๋ฌธ → 2 ๋ฐฉ๋ฌธ → 7 ๋ฐฉ๋ฌธ → 6 ๋ฐฉ๋ฌธ → 6 ๊บผ๋ → 8 ๋ฐฉ๋ฌธ → 8 ๊บผ๋ → 7 ๊บผ๋ → 2 ๊บผ๋ → 3 ๋ฐฉ๋ฌธ → 4 ๋ฐฉ๋ฌธ → 5 ๋ฐฉ๋ฌธ → 5 ๊บผ๋ → 4 ๊บผ๋ → 3 ๊บผ๋ → 1 ๊บผ๋
์ฐ๊ฒฐ๋ฆฌ์คํธ ์ ์
#define MAX_SIZE 1001
typedef struct Node {
int index;
struct Node *next;
} Node;
Node** a; // ์ ์ ์ด ์ฌ๋ฌ๊ฐ๋ผ๊ณ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ ์ด์ฐจ์ ํฌ์ธํฐ๋ก ํ ๋น
int n, m, c[MAX_SIZE]; // c๋ ๋ฐฉ๋ฌธ์ ํ๋์ง ํ์ธํ๋ ๋ณ์, n์ ์ ์ , m์ ๊ฐ์
addFront ํจ์
void addFront(Node *root, int index) {
Node *node = (Node*) malloc(sizeof(Node));
node->index = index; // ๋
ธ๋์ ์ธ๋ฑ์ค๋ ์ธ๋ฑ์ค์ด๋ค.
node->next = root->next; // ๋
ธ๋์ ๋ค์์ ๋ฃจํธ์ ๋ค์์ ๊ฐ๋ฆฌํจ๋ค.
root->next = node; // ๋ฃจํธ์ ๋ค์์ ๋
ธ๋์ด๋ค.
}
- ํด๋น ํจ์๋ก ๊ฐ์ฅ ์์ชฝ์ ๋ถ์ ์ ์๊ฒ ํ์ฌ ์คํ ์ฐ๊ฒฐ๋ฆฌ์คํธ์ฒ๋ผ ๋ง๋ค์๋ค.
dfs ํจ์
void dfs(int x) {
// ํ์ฌ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ค๊ณ ํ๋ฉด return; ํด์ค
if (c[x]) {
return ;
}
// ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
c[x] = 1;
printf("%d", x);
Node *cur = a[x]->next;
while (cur != NULL) {
int next = cur->index;
dfs(next);
cur = cur->next;
}
}
- ๊น์ด ์ฐ์ ํ์ ํจ์ ์ด๋ค.
- cur์ a[x]→next ๋ก ์ ์ํด์ฃผ๊ณ cur ์ด NULL์ด ์๋๋๊น์ง dfs() ๋ฅผ ์ฌ๊ทํธ์ถํ์ฌ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ํ ์ถ๋ ฅํด์ค๋ค.
main ํจ์
int main(void) {
scanf("%d %d", &n, &m);
a = (Node**)malloc(sizeof(Node*) * (MAX_SIZE));
for (int i = 1 ; i <= n ; i++) {
a[i] = (Node*)malloc(sizeof(Node));
a[i]->next = NULL;
}
for (int i = 0 ; i < m ; i++) {
int x, y;
scanf("%d %d", &x, &y);
addFront(a[x], y); // x๋ผ๋ ์ ์ ์์ y๋ก ๊ฐ์์๋ค
addFront(a[y], x); // y๋ผ๋ ์ ์ ์์ x๋ก ๊ฐ์์๋ค
}
dfs(1);
return 0;
}
- ์ฒซ๋ฒ์งธ for๋ฌธ์ ๋๋ฉฐ ๋ ธ๋์ ์ฌ์ด์ฆ๋ฅผ n ๋งํผ ์ด๊ธฐํ ํด์ค๋ค.
- ๋๋ฒ์งธ for๋ฌธ์ ๋๋ฉฐ addFront() ๋ฅผ ์ด์ฉํ์ฌ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด์ค๋ค.
- addFront() ๋ฅผ ๋๋ฒ ํด์ฃผ๋ ์ด์ ๋ x ↔ y๋ก ๊ฐ์์๊ฒ ํด์ฃผ๊ธฐ ์ํจ์ด๋ค.
- dfs() ํจ์๋ฅผ ์คํํ๋ค.
- ์์ 1๋ถํฐ ๊น์ด์ฐ์ ํ์์ ํ๊ธฐ ๋๋ฌธ์ ์ธ์ 1์ ๋ฃ์ด์ค๋ค.
- ์๋์๊ฐ์ด ์
๋ ฅํ๋ค๊ณ ๊ฐ์ ํ๋ค
- ๊ฒฐ๊ณผ : 1 → 3 → 2 ๋ฐฉ๋ฌธ
- 3 3 // n, m 1 2 // x, y 1 3 // x, y 2 3 // x, y
๋ง์น๋ฉฐ..
main() ํจ์์์ ์ ๋ ฅํ ๊ฐ์ผ๋ก๋ ์ผ๊ฐํ ๋ชจ์์ ํธ๋ฆฌ๊ฐ ๋์ฌ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ฌ 1 2 3 ์ด๋ผ๊ณ ๊ฒฐ๊ณผ ๊ฐ์ด ๋์ฌ ๊ฒ์ด๋ผ๊ณ ์์ํ์๋๋ฐ 1 3 2๋ก ๋์์ ์ ๊ทธ๋ด๊น ์๊ฐ์ ํด๋ณด์๋๋ฐ ํธ๋ฆฌ์ ์ค๋ฅธ์ชฝ๋ถํฐ ๋ฐฉ๋ฌธํ๋ ๊ฒ์ด ์๋๊ฐ ์ถ๋ค…
์ด๋ ต๋ค…