算法思想:
深度优先搜索在搜索过程中访问某个顶点后,需要递归地访问此顶点的所有未访问过的相邻顶点
代码实现:
#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; }