有没有权都一样,无向图也一个代码不差
using namespace std;
#include<iostream>
enum class EC {
OK, Shit
};
#define MaxInt 32767 // 表示极大值,即oo
#define MVNum 100 // 最大顶点数
typedef char VerTexType; // 设顶点的数据类型为字符型
typedef int ArcType; // 假设边的权值类型为整型
int* IsVisited;
//————【定义邻接矩阵的图结构
typedef struct {
VerTexType vexs[MVNum]; //顶点表
ArcType arcs[MVNum][MVNum]; //邻接矩阵
int vexnum, arcnum; //图的当前点数和边数
}AMGraph; // Adjacency Matrix Graph
//————【查找某个值在顶点表的位置
int LocateVex(AMGraph& G, VerTexType& u) {
for (int i = 0; i < G.vexnum; i++) {
if (u == G.vexs[i])
return i;
}
return -1;
}
//————【创建无向网
EC CreateUDN(AMGraph& G) {
cout << "请输入顶点个数:";
cin >> G.vexnum;
int nn = G.vexnum;
IsVisited = new int[nn]; //不知道这样行不行?
//初始化IsVisited为0
for (int i = 0; i < G.vexnum; i++) {
IsVisited[i] = 0;
}
cout << "请输入边数:";
cin >> G.arcnum;
//给顶点赋值
for (int i = 0; i < G.vexnum; i++) {
cout << "请输入各个顶点的值(char类型的),他们将按顺序存储到顶点表里面" << endl;
cin >> G.vexs[i];
}
//给边的权赋初始值(无穷大)
for (int i = 0; i < G.vexnum; i++) {
for (int j = 0; j < G.vexnum; j++) {
G.arcs[i][j] = MaxInt;
}
}
//开始给边赋真正的权值
for (int k = 0; k < G.arcnum; k++) {
cout << "请依次输入两个顶点的值,以及这两个顶点之间的边的权:";
char v1, v2;
int quan;
cin >> v1 >> v2 >> quan;
int m = LocateVex(G, v1);
int n = LocateVex(G, v2);
G.arcs[m][n] = quan;
G.arcs[n][m] = G.arcs[m][n];
}
return EC::OK;
}
//————【深度优先遍历,这里的v是顶点列表里面的下标(不是第几个顶点)
void DFS(AMGraph& G, int v) {
cout << G.vexs[v] << " ";
IsVisited[v] = 1; //访问第v+1个顶点
for (int w = 0; w < G.vexnum; w++) {
if (G.arcs[v][w] != MaxInt && IsVisited[w] == 0) //如果两点之间存在边,并且另一个点未被访问
{
DFS(G, w);
}
}
}
int main() {
AMGraph G;
CreateUDN(G);
cout << "深度优先遍历的结果是(显示访问的顶点在定点表中的“第数”):" << endl;
//从顶点表中的第二个顶点开始深度优先遍历
DFS(G, 1);
}
运行结果: