Binary tree 순회
#include <iostream>
using namespace std;
char arr[20] = " TBKRU";
void run(int now)
{
if(now > 20 ) return;
if(arr[now] == ' ' || arr[now] == 0) return;
cout << arr[now] << ' ' ;
run(now*2);
run(now*2 + 1);
}
int main()
{
run(1);
return 0;
}
Graph 탐색 ( 중복 없이)
#include <iostream>
using namespace std;
int map[6][6] = {
0, 1, 0, 1, 0, 0,
0, 0, 1, 0, 0, 0,
1, 0, 0, 0, 1, 1,
0, 0, 1, 0, 0, 1,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0
}, name[6] = {5, 7, 1, 9, 4, 2}, used[6];
void run(int now)
{
cout << name[now] << ' ';
for(int i=0; i<6; i++)
{
if(map[now][i] != 1) continue;
if(used[i] == 1) continue;
used[i] = 1;
run(i);
}
}
int main()
{
used[0] = 1;
run(0);
return 0;
}
dfs 탐색은 노드 탐색과 경로 탐색 두가지로 나뉜다. 노드 탐색은 중복을 체크한 것을 그대로 두고
경로 탐색은 중복 체크를 계속 초기화 해준다.
그래프 모든 경로 탐색해서 최소 비용 구하기
#include <iostream>
using namespace std;
int map[4][4] ={
0, 5, 15, 0,
3, 0, 0, 4,
0, 0, 0, 9,
1, 0, 7, 0
}, start, en, short_len = 21e8, used[4];
char name[5] = "ASKB";
void run(int sum, int now)
{
if(now == en)
{
if(short_len > sum)
short_len = sum;
return;
}
for(int i=0; i<4; i++)
{
if(map[now][i] == 0) continue;
if(used[i] == 1) continue;
used[i] = 1;
run(sum+map[now][i], i);
used[i] = 0;
}
}
int main()
{
cin >> start >> en;
used[start] = 1;
run(0, start);
cout << short_len;
return 0;
}
자식 노드가 2개이면 2진트리 사용하면 편함 그러나 이외의 경우 인접 행렬이나 인접리스트로 해야 한다.
현재 위치와 현재까지의 경로값 출력하기
#include <iostream>
using namespace std;
int arr[20] = {0, 5, 3, 7, 2, 4, 0, 1, 0, 0, 0, 0, 0, 0, 9};
void run(int now, int sum)
{
if(now > 20) return;
if(arr[now] == 0) return;
cout << arr[now] << '(' << sum+ arr[now] << ')' << '\n';
run(now*2, sum + arr[now]);
run(now*2 + 1, sum+ arr[now]);
}
int main()
{
run(1, 0);
return 0;
}
'C++ > 공부 정리' 카테고리의 다른 글
Union Find, MST, BST (0) | 2021.12.01 |
---|---|
BFS (0) | 2021.11.24 |
그래프와 트리, DFS, Binary tree (0) | 2021.11.01 |
연결리스트 삽입, 그래프(인접행렬과 인접리스트) (0) | 2021.10.25 |
연결리스트 탐색, 연결리스트로 구현한 큐(Queue)와 스택(Stack) (0) | 2021.10.22 |