第6章-算法6.5采用邻接矩阵表示图的深度优先搜索遍历
代码实现
#pragma once
#include <iostream>
using namespace std;
#define MVNum 100
#define MaxInt 0
#define MVNum 100
typedef char VerTexType;
typedef int ArcType;
typedef struct
{
VerTexType vexs[MVNum];
ArcType arcs[MVNum][MVNum];
int vexnum, arcnum;
}AMGraph;
int LocateVex(AMGraph G, VerTexType v)
{
int i;
for (i = 0; i < G.vexnum; i++)
{
if (v == G.vexs[i])
{
return i;
}
}
}
void CreateUDN(AMGraph& G)
{
VerTexType v1, v2;
ArcType w;
int row;
int col;
cout << "请输总顶点数:";
cin >> G.vexnum;
cout << "请输总边数:";
cin >> G.arcnum;
for (int i = 0; i < G.vexnum; i++)
{
cout << "输入顶点:";
cin >> G.vexs[i];
}
for (int m = 0; m < G.vexnum; m++)
{
for (int n = 0; n < G.vexnum; n++)
{
G.arcs[m][n] = MaxInt;
}
}
for (int k = 0; k < G.arcnum; k++)
{
cout << "输入边依附的顶点以及权值:";
cin >> v1 >> v2 >> w;
row = LocateVex(G, v1);
col = LocateVex(G, v2);
G.arcs[row][col] = w;
G.arcs[col][row] = G.arcs[row][col];
}
}
void ShowGraph(AMGraph G)
{
cout << "邻接矩阵为" << endl;
cout << " ";
for (int i = 0; i < G.vexnum; i++)
{
cout << G.vexs[i]<<" ";
}
cout << endl;
for (int i = 0; i < G.vexnum;i++)
{
cout << G.vexs[i]<<" ";
for (int j = 0; j < G.vexnum; j++)
{
cout << G.arcs[i][j]<<" ";
}
cout << endl;
}
}
bool visited[MVNum];
void DFS_AM(AMGraph G, int v)
{
cout << G.vexs[v];
visited[v] = true;
for (int w = 0; w < G.vexnum; w++)
{
if ((G.arcs[v][w] != 0) && (!visited[w]))
{
DFS_AM(G, w);
}
}
}
int main()
{
AMGraph G;
CreateUDN(G);
ShowGraph(G);
for (int i = 0; i < G.vexnum; i++)
{
visited[i] = false;
}
cout << "从哪个顶点开始DFS?" << endl;
int v;
cin >> v;
DFS_AM(G, v-1);
cout << endl;
system("pause");
return 0;
}
运行结果