強く接続されたコンポーネントのためのタージャンのアルゴリズム
Tarjanのアルゴリズムは、有向グラフの強連結成分を見つけるために使用されます。このアルゴリズムを実装するために必要なDFSトラバーサルは1つだけです。
DFSトラバーサルを使用して、フォレストのDFSツリーを見つけることができます。 DFSツリーから、強く接続されたコンポーネントが見つかります。そのようなサブツリーのルートが見つかると、サブツリー全体を表示できます。そのサブツリーは、1つの強連結成分です。
入力と出力
Input: Adjacency matrix of the graph. 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 Output: The strongly connected components: 4 3 1 2 0
アルゴリズム
findComponent(u、disc、low、stack、stackItemFlag)
入力: 開始ノード、検出時間、低、ディスクは頂点の検出時間を保持し、低はサブツリーに関する情報を保持します。頂点を保持するスタックと、スタック内のノードを追跡する別のフラグ配列。
出力: SCCを表示します。
Begin time := 0 //the value of time will not be initialized for next function calls set disc[u] := time+1 and low[u] := time + 1 time := time + 1 push u into stack stackItemFalg[u] := true for all vertex v which is adjacent with u, do if v is not discovered, then fincComponent(v, disc, low, stack, stackItemFalg) low[u] = minimum of low[u] and low[v] else if stackItemFalg[v] is true, then low[u] := minimum of low[u] and disc[v] done poppedItem := 0 if low[u] = disc[u], then while u is not in the stack top, do poppedItem := top of stack display poppedItem stackItemFlag[poppedItem] := false pop item from stack done poppedItem := top of stack display poppedItem stackItemFlag[poppedItem] := false pop item from stack End
strongConComponent(graph)
入力&、マイナス; 与えられたグラフ。
出力- 強く接続されたすべてのコンポーネント。
Begin initially set all items in the disc array to undiscovered for all elements in low to φ and mark no item is stored into the stack for all node i in the graph, do if disc[i] is undiscovered, then findComponent(i, disc, low, stack, stackItemFlag) End
例
#include<iostream>
#include<stack>
#define NODE 5
using namespace std;
int graph[NODE][NODE] = {
{0, 0, 1, 1, 0},
{1, 0, 0, 0, 0},
{0, 1, 0, 0, 0},
{0, 0, 0, 0, 1},
{0, 0, 0, 0, 0}
};
int min(int a, int b) {
return (a<b)?a:b;
}
void findComponent(int u, int disc[], int low[], stack<int>&stk, bool stkItem[]) {
static int time = 0;
disc[u] = low[u] = ++time; //inilially discovery time and low value is 1
stk.push(u);
stkItem[u] = true; //flag as u in the stack
for(int v = 0; v<NODE; v++) {
if(graph[u][v]) {
if(disc[v] == -1) { //when v is not visited
findComponent(v, disc, low, stk, stkItem);
low[u] = min(low[u], low[v]);
} else if(stkItem[v]) //when v is in the stack, update low for u
low[u] = min(low[u], disc[v]);
}
}
int poppedItem = 0;
if(low[u] == disc[u]) {
while(stk.top() != u) {
poppedItem = stk.top();
cout << poppedItem << " ";
stkItem[poppedItem] = false; //mark as item is popped
stk.pop();
}
poppedItem = stk.top();
cout << poppedItem <<endl;
stkItem[poppedItem] = false;
stk.pop();
}
}
void strongConComponent() {
int disc[NODE], low[NODE];
bool stkItem[NODE];
stack<int> stk;
for(int i = 0; i<NODE; i++) { //initialize all elements
disc[i] = low[i] = -1;
stkItem[i] = false;
}
for(int i = 0; i<NODE; i++) //initialize all elements
if(disc[i] == -1)
findComponent(i, disc, low, stk, stkItem);
}
int main() {
strongConComponent();
} 出力
4 3 1 2 0
-
C++での符号なし整数の除算アルゴリズムの復元
除算アルゴリズムを使用して符号なし整数を除算する方法について説明します。一部の除算アルゴリズムは紙に適用され、その他はデジタル回路に実装されます。除算アルゴリズムには、低速除算アルゴリズムと高速除算アルゴリズムの2種類があります。低速除算アルゴリズムには、復元、非実行復元、SRT、および非復元アルゴリズムが含まれます。 このチュートリアルでは、0<除数<被除数を想定した復元アルゴリズムについて説明します。 解決策を見つけるためのアプローチ ここでは、レジスタQを使用して商を格納し、レジスタAを使用して剰余を格納し、Mを使用して除数を格納します。 Aの初期値は0に保たれ、その値が復元されます
-
分散共有メモリを実装するためのアルゴリズム
共有メモリ 複数のプログラムからアクセスできるメモリブロックです。共有メモリの概念は、通信の方法を提供し、冗長性の少ないメモリ管理を提供するために使用されます。 分散共有メモリ DSMと略されます 分散システムでの共有メモリの概念の実装です。 DSMシステムは、システム内のローカルの物理共有メモリを奪われた疎結合システムに共有メモリモデルを実装します。このタイプのシステムでは、分散共有メモリは、すべてのシステム(ノードとも呼ばれます)がアクセスできる仮想メモリ空間を提供します。 )分散階層の。 DSMの実装中に留意すべきいくつかの一般的な課題- 共有メモリにリモートで保存されて