幅優先探索のC言語の隣接リスト

1.グラフトラバーサルトラバーサル方法には2つのタイプがあります。私たちが訪問した場合、深さ優先探索と幅優先トラバーサルは、違いのツリーをトラバースすると訪れたノードをマークするタグの配列を増やす必要があり、もはやアクセスすることができます

2.以下は、C言語の実装幅優先トラバーサルです。

、マップを保存し、以下の隣接テーブルを使用するには、①最初の必要性は、私の以前のブログの書き込みでマップを保存するために、隣接テーブルを使用して(マップを保存する方法です。https://blog.csdn.net/qq_39445165/article/details / 92692027

②幅優先探索キューのために我々は次のように特定のアルゴリズムの実装プロセスが達成するための助けが必要。

1)訪問したとして任意の一つの頂点にアクセス図のエンキューと頂点をマークしてください

2)ループが実行されたときにキューが空でない場合:デキュー、すべてデキュー頂点に隣接する頂点をチェックし、アクセスは、隣接する頂点とエンキューを訪問されていません

場合サイクルの終わり、幅優先探索を終了3)キューが空の場合

3.次に、実施隣接記憶構造のコード表です。

#include<stdio.h>
#include<iostream>
#define maxSize 10000
#include<malloc.h>
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;
//需要先进行初始化为0 
int visit[maxSize] = {0};
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 bfs(AGraph *G, int v){
	//使用到循环队列来进行处理 
	ArcNode *p;
	int que[maxSize], front = 0, rear = 0;
	int j;
	cout << v << " ";
	visit[v] = 1;
	rear = (rear + 1) % maxSize;
	que[rear] = v;
	while(front != rear){
		front = (front + 1) % maxSize;
		j = que[front];
		p = G->adjlist[j].firstarc;
		while(p != NULL){
			if(visit[p->adjvex] == 0){
				cout << p->adjvex << " ";
				visit[p->adjvex] = 1;
				rear = (rear + 1) % maxSize;
				que[rear] = p->adjvex;
			}
			p = p->nextarc;	
		}
	}	
}

int main(void){
	create();
	bfs(graph, 0);
	return 0;
} 

 

 

おすすめ

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