C ++図の隣接テーブル記憶の深さ優先探索。

図3の方法はそれぞれ、隣接行列の主メモリ、及び隣接テーブルエッジセットのデータ構造において、最初の二つの一般隣接リスト深さ優先検索を達成するためにC ++言語を次のベクトルである使用、使用および実装

手始めのために、隣接するテーブルを達成するためのリンクリストを使用しているため、プロセスは比較的複雑で、理解することは容易ではない、そこに複数のネストされた構造との相関関係があるので、我々は当接して少しシンプルなツールを学ぶために時間を使うことができますテーブル

2.以下は、特定の実装プロセスであります:

①のベクトル長配列ので変数は前記ので、調整]をN、それぞれのAdj [i]は、図1の専用記憶領域こと、配列可変長ベクトルであるように、頂点の数、あるベクター配列[N]を、開始することができます。これは、側面の数に関係しています

要素型のベクターは、直接int型、このようなベクターとして<整数>として宣言することができる隣接テーブルのみ代わりに右側を記憶する、各側端番号を格納する場合②、我々はすることができ

あなたは、エンドポイント番号と右側縁を格納する必要がある場合、構造は、ノードを作成することができ、次のように、数字と各辺の端縁の重みを格納するために使用されます。

struct Node{
	int v;
	int weight;
};

我々は3の1頂点に頂点から有向エッジを追加する必要がある場合、各ベクトル要素の隣接リストのようなタイプは、この時点で、Node型であり、図4は、それが一時的な変数タイプノードの一時として定義することができ、右側であります、そうtemp.v = 3、temp.w =、次いで温度調整後に加え、[1]のコードに次の通りであります:

Node temp;
temp.v = 3;
temp.w = 4;
Adj[1].push_back(temp)

次のようにテストデータは以下のとおりです。

5
6
0 1 1
0 2 2
0 3 3
1 4 4
2 4 2
3 4 5

3.次の(図に権利が格納されている)は、ベクトル特定隣接テーブルストレージ図の実装コードと深さ優先探索を用いて実現されます

#include<stdio.h>
#include<iostream>
#include<vector>
#define maxSize 1000 
using namespace std;
struct Node{
	int v;
	int weight;
};

vector<Node> Adj[maxSize];
bool vis[maxSize] = {false};
void dfs(int u){
	vis[u] = true;
	cout << u << " ";
	for(int i = 0; i < Adj[u].size(); i++){
		Node node = Adj[u][i];
		int v = node.v; 
		if(vis[v] == false){
			dfs(v);
		}
	}
}

int n, edges;
int main(void){
	cout << "输入图中的顶点数: ";
	cin >> n;
	cout << endl;
	cout << "输入图中的边数: ";
	cin >> edges;
	cout << endl << "输入图中的起始顶点, 结束顶点和边的权重: " << endl;
	int u = -1, v = -1, weight = -1;
	for(int i = 0; i < edges; i++){
		cin >> u >> v >> weight;
		Node newNode;
		newNode.v = v;
		newNode.weight = weight;
		Adj[u].push_back(newNode);
	}
	
	for(int i = 0; i < n; i++){
		//判断Adj[i]是否为空 
		if(!Adj[i].empty()){
			cout << i << " ";
			for(int j = 0; j < Adj[i].size(); j++){
				Node pop = Adj[i][j];
				cout << pop.v << " ";
			}
			cout << endl;
		}
	}
	cout << "深度优先搜索顶点的结果如下: " << endl;
	dfs(0);
	return 0;
} 

 

おすすめ

転載: blog.csdn.net/qq_39445165/article/details/93169597