(3) Graph
30304 ワード
DFS:スタック(FILO、タイリング、接続リスト)ですべてのパスを参照
BFS:最短距離ナビゲーション、ステップ頂点ナビゲーション、キュー(FIFO、配列、接続リスト)
Backtrakingによる改良
隣接マトリクス:メモリ密集型、トラック速度が速い
隣接リスト:メモリ使用量が少なく、ナビゲーション時間が遅い
Inputのサイズに応じて決定
1. DFS
💡 **Stack**:FILO、STLライブラリのスタックデータ構造、push()、pop()、empty()、top()などの関数を使用
**Queue*:FIFO、STLライブラリのキューデータ構造、push()、pop()、空()、front()などの関数を利用
スタックのpushアルゴリズム
#define STACK_SIZE 100
int stack[STACK_SIZE];
int top = 1;
void push(int val)
{
if (top >= STACK_SIZE - 1)
return ;
else
stack[++top] = val;
}
スタック内のpopアルゴリズム
int pop(void)
{
if (top == -1)
return (0); // empty
else
return (stack[top--]);
}
DFSアルゴリズム-再帰
int graph[MAX_N][MAX_N];
bool visited[MAX_N];
void dfs(int node)
{
visited[node] = true;
// cout << node << ' ';
for (int next = 0; next < N; ++next)
{
if (visited[next] == false && graph[node][next])
dfs(next);
}
}
DFSアルゴリズム-繰り返し
int graph[MAX_N][MAX_N]
int stack[STACK_SIZE];
int top;
void dfs(int node)
{
int cur;
bool visited[MAX_N] = {false, };
top = -1;
stack[++top] = node;
while (top != -1)
{
cur = stack[top--];
if (visited[cur] == false)
{
visited[cur] = true;
// cout << cur << ' ';
for (int next = 0; next < N; ++next)
if (visited[next] = false && graph[cur][next])
stack[++top] = next;
}
}
}
2. BFS
キュー内のenqueueアルゴリズム
#define QUEUE_SIZE 100
int queue[QUEUE_SIZE];
int front = -1, rear = -1;
void enqueue(int val)
{
if (rear >= QUEUE_SIZE - 1)
return ; // overflow
else
queue[++rear] = val;
}
キューのdequeueアルゴリズム
int dequeue(void)
{
if (front == rear)
return (0); // empty
else
return (queue[++front]);
}
円形キューのenqueueアルゴリズム
#define QUEUE_SIZE 100
int queue[QUEUE_SIZE];
int size = 0, front = -1, rear = -1;
void enqueue(int val)
{
if (size >= QUEUE_SIZE)
return ;
else
{
++size;
rear = (rear + 1) % QUEUE_SIZE;
queue[rear] = val;
}
}
円形キューのdequeueアルゴリズム
int dequeue()
{
if (size == 0)
return (0); // empty
else
{
--size;
front = (front + 1) % QUEUE_SIZE;
return (queue[front]);
}
}
BFSアルゴリズム
int graph[MAX_N][MAX_N]
int queue[QUEUE_SIZE];
int front, rear;
void bfs(int node)
{
int cur;
bool visited[MAX_N] = {false, };
front = rear = -1;
queue[++rear] = node;
while (front != rear)
{
cur = queue[++front];
if (visited[cur] == false)
{
visited[cur] = true;
for (int next = 0; next < N; ++next)
{
if (visited[next] == false && graph[cur][next])
queue[++rear] = next;
}
}
}
}
BFSアルゴリズム:Queueの使用を減らすために改善
int graph[MAX_N][MAX_N]
int queue[QUEUE_SIZE];
int front, rear;
void bfs(int node)
{
bool visited[MAX_N] = {false, };
int cur;
front = rear = -1;
visited[node] = true;
queue[++rear] = node;
while (front != rear)
{
cur = queue[++front];
// cout << cur << ' ';
visited[cur] = true;
for (int next = 0; next < N; ++next)
{
if (visited[next] == false && graph[cur][next])
{
visited[next] = true;
queue[++rear] = next;
}
}
}
}
最短距離計算アルゴリズム,無重みの図形からBFSへ
int graph[MAX_N][MAX_N];
int dist[MAX_N];
int queue[QUEUE_SIZE];
int front, rear;
void bfs(int node)
{
bool visited[MAX_N] = {false, };
int cur;
dist[node] = 0;
front = rear = -1;
visited[node] = true;
queue[++rear] = node;
while (front != rear)
{
cur = queue[++front];
// cout << cur << ' ';
visited[cur] = true;
for (int next = 0; next < N; ++next)
{
if (visited[next] == false && graph[cur][next])
{
dist[next] = dist[cur] + 1;
visited[next] = true;
queue[++rear] = next;
}
}
}
3. Backtracking
DFSとBackstrackingの違い
Reference
この問題について((3) Graph), 我々は、より多くの情報をここで見つけました https://velog.io/@24siefil/3-Graphテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol