1.グラフトラバーサルトラバーサル方法には2つのタイプがあります。私たちが訪問した場合、深さ優先探索と幅優先トラバーサルは、違いのツリーをトラバースすると訪れたノードをマークするタグの配列を増やす必要があり、もはやアクセスすることができます
2.以下は、深さ優先トラバーサルのC言語の実装です。
、マップを保存し、以下の隣接テーブルを使用するには、①最初の必要性は、私の以前のブログの書き込みでマップを保存するために、隣接テーブルを使用して(マップを保存する方法です。https://blog.csdn.net/qq_39445165/article/details / 92692027)
②頂点が訪問されているかどうかをマークするために配列を宣言、深さ優先トラバーサルをマッピングします
3.以下は、特定のプログラムです。
#include<stdio.h>
#include<iostream>
#include<malloc.h>
#define maxSize 1000
int visit[maxSize];
using namespace std;
typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc;
int info;
}ArcNode;
typedef struct{
int data;
ArcNode *firstarc;
}Vnode;
typedef struct{
Vnode adjlist[maxSize];
int n, e;
}AGraph;
AGraph *graph;
void insertNode(ArcNode *node, ArcNode *newNode){
ArcNode *p = node;
while(p->nextarc != NULL){
p = p->nextarc;
}
p->nextarc = newNode;
}
void create(){
graph = (AGraph*)malloc(sizeof(AGraph));
cout << "输入顶点的数目: " << endl;
cin >> graph->n;
cout << "输入图中边的数目: " << endl;
cin >> graph->e;
int u = -1, v = -1, weight = -1;
for(int i = 0; i < graph->n; i++){
graph->adjlist[i].firstarc = NULL;
}
ArcNode *node;
for(int i = 0; i < graph->e; i++){
cin >> u >> v >> weight;
node = (ArcNode *)malloc(sizeof(ArcNode));
node->adjvex = v;
node->info = weight;
node->nextarc = NULL;
graph->adjlist[u].data = u;
if(graph->adjlist[u].firstarc == NULL){
graph->adjlist[u].firstarc = node;
}else{
insertNode(graph->adjlist[u].firstarc, node);
}
}
}
//深度优先遍历
void dfs(AGraph *G, int v){
ArcNode *p;
visit[v] = 1;
cout << v << " ";
p = G->adjlist[v].firstarc;
while(p != NULL){
if(visit[p->adjvex] == 0){
dfs(G, p->adjvex);
}
p = p->nextarc;
}
}
int main(void){
create();
dfs(graph, 0);
return 0;
}