C++ Rookiss Part3 자료구조와 알고리즘 : DFS
🙇♀️DFS
🪐DFS
#include <iostream>
#include <vector>
#include <list>
#include <stack>
#include <queue>
using namespace std;
// [ ][ ][ ][ ][ ][ ][ ][ ]
// DFS (Depth First Search) 깊이 우선 탐색
// BFS (Breadth First Search) 너비 우선 탐색
struct Vertex
{
// int data;
};
vector<Vertex> vertices;
vector<vector<int>> adjacent;
vector<bool> visited;
void CreateGraph()
{
vertices.resize(6);
adjacent = vector<vector<int>>(6);
// 인접 리스트
/*adjacent[0].push_back(1);
adjacent[0].push_back(3);
adjacent[1].push_back(0);
adjacent[1].push_back(2);
adjacent[1].push_back(3);
adjacent[3].push_back(4);
adjacent[5].push_back(4);*/
// 인접 행렬
adjacent = vector<vector<int>>
{
{ 0, 1, 0, 1, 0, 0},
{ 1, 0, 1, 1, 0, 0},
{ 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 1, 0},
{ 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 1, 0},
};
}
void Dfs(int here)
{
// 방문!
visited[here] = true;
cout << "Visited : " << here << endl;
// 인접 리스트 version
// 모든 인접 정점을 순회한다
//for (int i = 0; i < adjacent[here].size(); i++)
//{
// int there = adjacent[here][i];
// if (visited[there] == false)
// Dfs(there);
//}
// 인접 행렬 version
// 모든 인접 정점을 순회한다
for (int there = 0; there < 6; there++)
{
if (adjacent[here][there] == 0)
continue;
// 아직 방문하지 않은 곳이 있으면 방문한다
if (visited[there] == false)
Dfs(there);
}
}
void DfsAll()
{
visited = vector<bool>(6, false);
for (int i = 0; i < 6; i++)
if (visited[i] == false)
Dfs(i);
}
int main()
{
CreateGraph();
//visited = vector<bool>(6, false);
//Dfs(0);
DfsAll();
}
🪐DFS
내가 다시 만든 버전
#include <iostream>
#include <vector>
using namespace std;
// 정점을 관리할 struct Vertex
// 정점들을 선언 vector<Vertex>
// 인접한 정점들을 선언 vector<vector<int>>
// 방문 확인 vector<bool>
//
//
//
struct Vertex // 정점 관리
{
// int data;
};
vector<Vertex> edges;
vector<vector<int>> adjacent;
vector<vector<int>> adjacent2;
vector<bool> visited;
void CreateGraph()
{
edges.resize(6);
adjacent = vector<vector<int>>(6);
adjacent2 = vector<vector<int>>(6);
// 인접 리스트
adjacent[0].push_back(1);
adjacent[0].push_back(3);
adjacent[1].push_back(0);
adjacent[1].push_back(2);
adjacent[1].push_back(3);
adjacent[3].push_back(4);
adjacent[5].push_back(4);
// 인접 행렬
adjacent2 = vector<vector<int>>
{
{ 0, 1, 0, 1, 0, 0 },
{ 1, 0, 1, 1, 0, 0 },
{ 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 1, 0 },
{ 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 1, 0 },
};
}
void DfsByList(int here) // 인접 리스트 버전
{
// 방문!
visited[here] = true;
cout << "Visited : " << here << endl;
// 인접 리스트 version
// 모든 인접 정점을 순회
for (int i = 0; i < adjacent[here].size(); i++) // 연결된 애들을 순회
{
int there = adjacent[here][i];
if (visited[there] == false)
DfsByList(there);
}
}
void DfsByProcession(int here) // 인접 행렬 버전
{
// 방문!
visited[here] = true;
cout << "Visited : " << here << endl;
// 인접 행령 version
// 모든 인접 정점을 순회
for (int there = 0; there < 6; there++)
{
if (adjacent2[here][there] == 0) // 모든 애들이 일단은 그려져 있으니 길이 끊겨 있으면 continue
continue;
// 방문x -> 방문
if (visited[there] == false) // 길이 이어져 있고 방문 기록이 없으면 재귀호출
DfsByProcession(there);
}
}
void DfsByListAll()
{
visited = vector<bool>(6, false);
for (int i = 0; i < 6; i++)
if (visited[i] == false)
DfsByList(i);
}
void DfsByProcessionAll()
{
visited = vector<bool>(6, false);
for (int i = 0; i < 6; i++)
if (visited[i] == false)
DfsByProcession(i);
}
int main()
{
CreateGraph();
DfsByListAll();
DfsByProcessionAll();
return 0;
}