邻接矩阵c++存储有向图无向图加权图
时间: 2023-10-05 22:12:34 浏览: 191
邻接矩阵是一种常用的图的表示方法,可以用于存储有向图、无向图和加权图。在邻接矩阵中,矩阵的行和列分别表示图中的顶点,矩阵中的元素表示两个顶点之间是否存在边或者边的权重。
对于有向图,邻接矩阵的元素A[i][j]表示从顶点i到顶点j是否存在一条有向边。如果A[i][j]的值为1,则表示存在有向边;如果A[i][j]的值为0,则表示不存在有向边。
对于无向图,邻接矩阵是对称的,即A[i][j]的值与A[j][i]的值相等。如果A[i][j]的值为1,则表示顶点i与顶点j之间存在一条无向边;如果A[i][j]的值为0,则表示顶点i与顶点j之间不存在边。
对于加权图,邻接矩阵的元素A[i][j]可以表示边的权重。如果A[i][j]的值为0,则表示顶点i与顶点j之间不存在边;如果A[i][j]的值为非零正数,则表示顶点i与顶点j之间存在一条边,并且边的权重为A[i][j]的值。
相关问题
用c++实验无向图有向图关联矩阵,邻接矩阵的存储结构,以及深度遍历算法
在C++中,无向图和有向图通常使用邻接矩阵(Adjacency Matrix)作为其存储结构。邻接矩阵是一个二维数组,其中行代表图中的顶点,列表示每个顶点连接的顶点集合。对于无向图,邻接矩阵是对称的,即如果(i, j)位置的值存在,则(j, i)位置也有相同的值;而对于有向图,邻接矩阵是对角线不对称的,表示从一个顶点到另一个顶点是否有边。
存储结构通常是这样的:
1. 对于无向图:`adjMatrix[vertex][vertex]`
2. 对于有向图:`adjMatrix[vertex][neighbor]`
深度优先搜索(Depth-First Search, DFS)是一种用于遍历图的算法,特别是用于寻找连通分量、拓扑排序等应用。在邻接矩阵上实现DFS的基本步骤如下:
```cpp
void dfs(int start, bool graph[vertices][vertices], vector<bool>& visited) {
// 标记当前节点已访问
visited[start] = true;
cout << start << " ";
// 遍历邻居节点
for (int i = 0; i < vertices; i++) {
if (graph[start][i] && !visited[i]) {
dfs(i, graph, visited);
}
}
}
```
在这个函数里,`start`是起点,`graph`是邻接矩阵,`visited`是一个布尔数组记录了每个节点是否被访问过。通过递归地访问未访问过的邻居节点,直到遍历完所有可达路径。
c++显示无向图和有向图的邻接矩阵
以下是 C++ 代码示例,用于显示无向图和有向图的邻接矩阵:
```c++
#include <iostream>
using namespace std;
const int MAX = 100;
// 无向图邻接矩阵
void displayUndirectedGraph(int graph[MAX][MAX], int vertices) {
cout << "无向图邻接矩阵:" << endl;
for (int i = 0; i < vertices; i++) {
for (int j = 0; j < vertices; j++) {
cout << graph[i][j] << " ";
}
cout << endl;
}
}
// 有向图邻接矩阵
void displayDirectedGraph(int graph[MAX][MAX], int vertices) {
cout << "有向图邻接矩阵:" << endl;
for (int i = 0; i < vertices; i++) {
for (int j = 0; j < vertices; j++) {
cout << graph[i][j] << " ";
}
cout << endl;
}
}
int main() {
int vertices, edges, graph[MAX][MAX];
cout << "请输入图的顶点数和边数:" << endl;
cin >> vertices >> edges;
// 初始化邻接矩阵
for (int i = 0; i < vertices; i++) {
for (int j = 0; j < vertices; j++) {
graph[i][j] = 0;
}
}
// 读取边的信息
int src, dest;
for (int i = 0; i < edges; i++) {
cout << "请输入第 " << i + 1 << " 条边的起点和终点:" << endl;
cin >> src >> dest;
graph[src][dest] = 1;
graph[dest][src] = 1; // 无向图需要反向增加一条边
}
// 显示邻接矩阵
displayUndirectedGraph(graph, vertices);
displayDirectedGraph(graph, vertices);
return 0;
}
```
在上面的代码示例中,我们使用了两个函数 `displayUndirectedGraph` 和 `displayDirectedGraph` 来分别显示无向图和有向图的邻接矩阵。通过输入图的顶点数和边数,以及每条边的起点和终点,我们可以构建邻接矩阵,并将其显示出来。其中,对于无向图,我们需要反向增加一条边,以便将边的信息存储在邻接矩阵中。
阅读全文