#include <iostream> #include <queue> using namespace std; // 定义图的最大顶点数 #define MAX_VERTEX_NUM 100 // 图的邻接矩阵表示 typedef struct { int vertex[MAX_VERTEX_NUM]; // 顶点数组 int edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵 int vertexNum; // 顶点数量 int edgeNum; // 边数量 } GraphMatrix; // 初始化图 void initGraph(GraphMatrix& graph) { graph.vertexNum = 0; graph.edgeNum = 0; for (int i = 0; i < MAX_VERTEX_NUM; i++) { graph.vertex[i] = 0; for (int j = 0; j < MAX_VERTEX_NUM; j++) { graph.edges[i][j] = 0; } } } // 添加顶点 void addVertex(GraphMatrix& graph, int v) { if (graph.vertexNum < MAX_VERTEX_NUM) { graph.vertex[graph.vertexNum] = v; graph.vertexNum++; } } // 添加边 void addEdge(GraphMatrix& graph, int v1, int v2) { int i, j; for (i = 0; i < graph.vertexNum; i++) { if (graph.vertex[i] == v1) break; } for (j = 0; j < graph.vertexNum; j++) { if (graph.vertex[j] == v2) break; } if (i < graph.vertexNum && j < graph.vertexNum) { graph.edges[i][j] = 1; graph.edges[j][i] = 1; graph.edgeNum++; } } // 销毁图 void destroyGraph(GraphMatrix& graph) { graph.vertexNum = 0; graph.edgeNum = 0; } // 深度优先遍历 void depthFirstSearch(GraphMatrix& graph, int v, bool visited[]) { visited[v] = true; cout << graph.vertex[v] << " "; for (int i = 0; i < graph.vertexNum; i++) { if (graph.edges[v][i] == 1 && !visited[i]) { depthFirstSearch(graph, i, visited); } } } // 深度优先遍历图 void DFS(GraphMatrix& graph) { bool visited[MAX_VERTEX_NUM]; for (int i = 0; i < graph.vertexNum; i++) { visited[i] = false; } for (int i = 0; i < graph.vertexNum; i++) { if (!visited[i]) { depthFirstSearch(graph, i, visited); } } cout << endl; } // 广度优先遍历图 void BFS(GraphMatrix& graph) { bool vis这段代码的不足
时间: 2024-02-15 11:24:58 浏览: 78
这段代码的不足可能有以下几点:
1. 缺少输入检查:在添加顶点和添加边的函数中,没有检查输入的参数是否合法,比如顶点数量是否已经达到最大值,或者添加的边是否已经存在。
2. 图的存储方式不够灵活:这里使用邻接矩阵来表示图,虽然在一些场景下比较方便,但是对于稀疏图来说,会浪费大量的空间。因此,可以考虑使用邻接表等其他存储方式。
3. 没有考虑多个连通分量的情况:在深度优先遍历和广度优先遍历的函数中,只考虑了单个连通分量的情况。如果图由多个连通分量组成,就只能遍历其中一个连通分量。
4. 代码可读性不够好:代码中缺少注释,函数命名不够规范,导致代码可读性不够好,不利于后期维护和修改。
相关问题
用C++代码实现:理解并实现无向图邻接矩阵的创建,理解并实现无向图邻接矩阵方式存储的广度优先遍历的算法,转换成程序并上机实现; //用两个数组分别存储顶点表和邻接矩阵 #define MaxInt 32767 //表示极大值,即∞ #define MVNum 100 //最大顶点数 typedef char VerTexType; //假设顶点的数据类型为字符型 typedef int ArcType; //假设边的权值类型为整型 typedef struct{ VerTexType vexs[MVNum]; //顶点表 ArcType arcs[MVNum][MVNum]; //邻接矩阵 int vexnum,arcnum; //图的当前点数和边数 }AMGraph;
以下是C++代码实现:
```cpp
#include <iostream>
#include <queue>
using namespace std;
#define MaxInt 32767
#define MVNum 100
typedef char VerTexType;
typedef int ArcType;
typedef struct{
VerTexType vexs[MVNum];
ArcType arcs[MVNum][MVNum];
int vexnum, arcnum;
}AMGraph;
void CreateUDN(AMGraph &G) {
cout << "请输入顶点数和边数:" << endl;
cin >> G.vexnum >> G.arcnum;
cout << "请输入顶点信息:" << endl;
for(int i = 0; i < G.vexnum; i++) {
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;
}
}
cout << "请输入边的信息:" << endl;
for(int k = 0; k < G.arcnum; k++) {
int i, j, w;
cin >> i >> j >> w;
G.arcs[i][j] = w;
G.arcs[j][i] = w;
}
}
void BFS(AMGraph G, int v, bool visited[]) {
queue<int> q;
cout << G.vexs[v] << " ";
visited[v] = true;
q.push(v);
while(!q.empty()) {
int w = q.front();
q.pop();
for(int i = 0; i < G.vexnum; i++) {
if(G.arcs[w][i] != MaxInt && !visited[i]) {
cout << G.vexs[i] << " ";
visited[i] = true;
q.push(i);
}
}
}
}
void BFSTraverse(AMGraph G) {
bool visited[MVNum] = {false};
for(int i = 0; i < G.vexnum; i++) {
if(!visited[i]) {
BFS(G, i, visited);
}
}
}
int main() {
AMGraph G;
CreateUDN(G);
cout << "广度优先遍历结果:" << endl;
BFSTraverse(G);
return 0;
}
```
在这段代码中,我们使用了一个邻接矩阵来存储无向图,包括顶点表和邻接矩阵两个数组。函数 `CreateUDN` 可以创建一个无向图,并且使用了一个二维数组 `arcs` 来存储边的权值。
函数 `BFS` 实现了广度优先遍历算法,使用了一个队列来存储需要遍历的顶点。函数 `BFSTraverse` 则是对整个图进行了广度优先遍历。
在 `main` 函数中,我们先创建了一个无向图,然后调用 `BFSTraverse` 函数进行广度优先遍历,并输出结果。
void Dijkstra(ALGraph g,int v) { //求从v到其他顶点的最短路径 /********** Begin **********/ /********** End **********/ }补全代码
好的,下面是 Dijkstra 算法的 C++ 代码实现:
```cpp
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
#define INF 0x3f3f3f3f
// 图的邻接表表示
typedef struct ArcNode {
int adjvex; // 邻接点编号
int weight; // 边的权重
struct ArcNode *next; // 指向下一条边的指针
} ArcNode;
typedef struct VNode {
char data; // 顶点数据
ArcNode *firstarc; // 指向第一条边的指针
} VNode, AdjList[MAX_VERTEX_NUM];
typedef struct {
AdjList vertices; // 顶点数组
int vexnum, arcnum; // 顶点数和边数
} ALGraph;
// 辅助结构体,用于记录最短路径
typedef struct {
int dist; // 距离
int path; // 前驱结点
} Path;
// Dijkstra 算法
void Dijkstra(ALGraph g, int v) {
// 初始化距离数组和标记数组
vector<int> dist(g.vexnum, INF);
vector<int> visited(g.vexnum, 0);
// 设置起点距离为0
dist[v] = 0;
// 创建小根堆,并将起点加入堆中
priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > q;
q.push(make_pair(dist[v], v));
// 循环处理堆中的结点,直到堆为空
while (!q.empty()) {
// 取出堆顶元素
int u = q.top().second;
q.pop();
// 如果已经访问过,则直接跳过
if (visited[u]) {
continue;
}
// 标记该结点已经访问
visited[u] = 1;
// 遍历所有邻接点
for (ArcNode *p = g.vertices[u].firstarc; p != NULL; p = p->next) {
int v = p->adjvex; // 邻接点编号
int weight = p->weight; // 边的权重
// 如果到该点的路径更短,则更新路径
if (dist[u] + weight < dist[v]) {
dist[v] = dist[u] + weight; // 更新距离
q.push(make_pair(dist[v], v)); // 将该点加入堆中
}
}
}
// 输出最短路径
for (int i = 0; i < g.vexnum; i++) {
if (dist[i] == INF) {
cout << "顶点" << v << "到顶点" << i << "不存在路径" << endl;
} else {
cout << "顶点" << v << "到顶点" << i << "的最短路径为:" << dist[i] << endl;
}
}
}
int main() {
// 创建有向图
ALGraph g;
g.vexnum = 5;
g.arcnum = 7;
g.vertices[0].data = 'A';
g.vertices[1].data = 'B';
g.vertices[2].data = 'C';
g.vertices[3].data = 'D';
g.vertices[4].data = 'E';
g.vertices[0].firstarc = new ArcNode{1, 2, new ArcNode{3, 1, NULL}};
g.vertices[1].firstarc = new ArcNode{2, 3, new ArcNode{4, 1, NULL}};
g.vertices[2].firstarc = new ArcNode{4, 5, NULL};
g.vertices[3].firstarc = new ArcNode{2, 1, new ArcNode{4, 4, NULL}};
g.vertices[4].firstarc = new ArcNode{2, 6, new ArcNode{3, 3, NULL}};
// 调用 Dijkstra 算法
Dijkstra(g, 0);
return 0;
}
```
以上代码为您提供了一个基本的 Dijkstra 算法实现,您可以根据您的实际需求进行修改。
阅读全文