从图中的某个顶点v出发,访问此顶点,然后从v的未访问的邻接点出发深度优先遍历图,直到图中和v有路径相通的顶点都被访问到。
// 1. 建立图的邻接矩阵
// 2.深度优先遍历
// 图的存储结构
// 结点数组 + 结点的邻接矩阵
/*
vexs[MAxNum] = {v0, v1, v2, v3, v4}
v0, v1, v2, v3, v4
v0 0 1 0 1 0
v1 1 0 0 0 1
v2 0 0 0 1 1
v3 1 0 1 0 0
v4 0 1 1 0 0
*/
#include <string>
#include <iostream>
#define MAXNum 100
using namespace std;
struct AMGraph // Adjacency Matrix Graph
{
char vexs[MAXNum]; // 结点数组
int arcs[MAXNum][MAXNum]; //邻接矩阵
int vexNum; // 结点数
int arcNum; //边数
};
// 创建图
void CreateGraph(AMGraph& G);
// 定位结点的下标
int LocateArc(const AMGraph& G, const char &u);
// 深度优先遍历
void DFS(const AMGraph& G, int u, bool* visited);
int main()
{
AMGraph G;
CreateGraph(G);
// // 测试是否创建成功
// // 顶点数组创建
// for (int i = 0; i < G.vexNum; ++i)
// cout << G.vexs[i] << " ";
// cout << endl;
// // 打印邻接矩阵
// for (int i = 0; i < G.vexNum; ++i)
// {
// for (int j = 0; j < G.vexNum; ++j)
// cout << G.arcs[i][j] << " ";
// cout << endl;
// }
// 定义个记录是否访问过某结点的数组
bool *visited;
visited = new bool[G.vexNum];
for (int i = 0; i < G.vexNum; ++i)
visited[i] = false;
DFS(G, 0, visited);
return 0;
}
void CreateGraph(AMGraph &G)
{
cout << "输入顶点数,和边数" << endl;
cin >> G.vexNum >> G.arcNum;
// 创建结点数组
cout << "输入结点数组" << endl;
for (int i = 0; i < G.vexNum; ++i)
cin >> G.vexs[i];
// 创建邻接矩阵
// 初始化邻接矩阵,将所有边初始化为0
for (int i = 0; i < G.vexNum; ++i)
for (int j = 0; j < G.vexNum; ++j)
G.arcs[i][j] = 0;
// 将结点间有边的邻接矩阵设置为1
for (int k = 0; k < G.arcNum; ++k)
{
char u, v;
cout << "输入两个相连结点信息:" << endl;
cin >> u >> v;
// 定位这条边在邻接矩阵中的位置,并将边设置为1
int i = LocateArc(G, u);
int j = LocateArc(G, v);
G.arcs[i][j] = 1;
G.arcs[j][i] = 1; // 邻接矩阵沿对角线对称
}
}
int LocateArc(const AMGraph& G, const char &u)
{
// 定位结点的下标
for (int i = 0; i < G.vexNum; ++i)
if (G.vexs[i] == u)
return i;
return -1;
}
void DFS(const AMGraph& G, int u, bool* visited)
{
// 先访问该结点u
cout << G.vexs[u] << " ";
visited[u] = true;
// cout << u << ": " << visited[u] << endl;
for (int i = 0; i < G.vexNum; ++i)
{
// 判断该结点所在行是否存在不为0(即相邻的结点),且没有被访问过的结点
if ((G.arcs[u][i] != 0) && (!visited[i]))
{
// cout << i << ": " << visited[i] << endl;
DFS(G, i, visited);
}
}
return;
}