DFS深度优先搜索(邻接矩阵)

算法思想
        深度优先搜索在搜索过程中访问某个顶点后,需要递归地访问此顶点的所有未访问过的相邻顶点

代码实现:
#include "stdafx.h"
#include <iostream>
#include <cstring>

using namespace std;

class Graph {
private:
	int vexnum;			// 顶点数目 
	int edge;			// 边数 
	int **arc;			// 邻接矩阵
	int *visit;			// 标记数组
public:
	Graph(int vexnum, int edge);		// 邻接矩阵法创建图 
	~Graph();
	bool check_edge_value(int start, int end, int weight);	// 检查插入元素位置是否正确
	void CreateGraph();				// 导入数据构建图
	void DFS(int start);			// 深度优先搜索
	void init_visit();				// 初始化标记数组
};

void Graph::init_visit()
{
	visit = new int[vexnum];
	memset(visit, 0, sizeof(int)*6);
}

Graph::Graph(int vexnum, int edge)
{
	this->vexnum = vexnum;
	this->edge = edge;
	arc = new int *[this->vexnum];
	for (int i = 0; i < this->vexnum; ++i)
	{
		arc[i] = new int[this->vexnum];
		for (int k = 0; k < this->vexnum; ++k)
			arc[i][k] = INT_MAX;
	}
}

Graph::~Graph()
{
	for (int i = 0; i < vexnum; ++i)
		delete arc[i];
	delete arc;
}

bool Graph::check_edge_value(int start, int end, int weight)
{
	if (start < 1 || end < 1 || weight < 0 || start > vexnum || end > vexnum)
		return false;
	return true;
}


void Graph::CreateGraph()
{
	cout << "input every points start end weight" << endl;
	int start, end, weight, count = 0;
	while (count != edge)
	{
		cin >> start >> end >> weight;
		while (!check_edge_value(start, end, count))
		{
			cout << "input error,please again" << endl;
			cin >> start >> end >> weight;
		}
		arc[start - 1][end - 1] = weight;
		arc[end - 1][start - 1] = weight;
		++count;
	}
	init_visit();
}

void Graph::DFS(int start)
{
	visit[start-1] = 1;
	for (int k = 1; k <= vexnum; ++k)
	{
		if (!visit[k-1] && arc[start-1][k-1] != INT_MAX)	//  k 节点未被遍历过且存在到达 k 的路径
		{
			DFS(k);
		}
	}
	cout << start << " ";
}



int main()
{
	Graph g(6, 8);
	g.CreateGraph();
	g.DFS(1);
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/adorkable_thief/article/details/80173054