用邻接矩阵创建一个带权有向图并实现计算各顶点的入度,深度优先遍历,广度优先遍历
时间: 2023-06-22 07:23:37 浏览: 145
好的,下面是基于邻接矩阵的带权有向图的实现和相关操作的代码(使用 C++ 语言实现):
```cpp
#include <iostream>
#include <queue>
using namespace std;
const int MAX_SIZE = 100; // 最大顶点数
const int INF = 0x3f3f3f3f; // 定义一个无穷大的数
class Graph {
private:
int vertex_num; // 顶点数
int edge_num; // 边数
int matrix[MAX_SIZE][MAX_SIZE]; // 邻接矩阵
public:
Graph(int n, int m) : vertex_num(n), edge_num(m) {
// 初始化邻接矩阵
for (int i = 1; i <= vertex_num; i++) {
for (int j = 1; j <= vertex_num; j++) {
matrix[i][j] = INF;
}
}
}
// 添加一条从 u 到 v 的边,权值为 w
void addEdge(int u, int v, int w) {
matrix[u][v] = w;
}
// 计算各个顶点的入度
void calcInDegree() {
int in_degree[MAX_SIZE] = {0};
for (int j = 1; j <= vertex_num; j++) {
for (int i = 1; i <= vertex_num; i++) {
if (matrix[i][j] != INF) {
in_degree[j]++;
}
}
}
for (int i = 1; i <= vertex_num; i++) {
cout << "顶点 " << i << " 的入度为 " << in_degree[i] << endl;
}
}
// 深度优先遍历
void dfs(int u, bool visited[]) {
visited[u] = true;
cout << u << " ";
for (int v = 1; v <= vertex_num; v++) {
if (matrix[u][v] != INF && !visited[v]) {
dfs(v, visited);
}
}
}
// 从顶点 s 开始进行深度优先遍历
void dfsTraversal(int s) {
bool visited[MAX_SIZE] = {false};
dfs(s, visited);
cout << endl;
}
// 广度优先遍历
void bfsTraversal(int s) {
bool visited[MAX_SIZE] = {false};
queue<int> q;
q.push(s);
visited[s] = true;
while (!q.empty()) {
int u = q.front();
q.pop();
cout << u << " ";
for (int v = 1; v <= vertex_num; v++) {
if (matrix[u][v] != INF && !visited[v]) {
q.push(v);
visited[v] = true;
}
}
}
cout << endl;
}
};
int main() {
int n, m;
cout << "请输入顶点数和边数:";
cin >> n >> m;
Graph graph(n, m);
cout << "请依次输入边的起点、终点和权值:" << endl;
for (int i = 1; i <= m; i++) {
int u, v, w;
cin >> u >> v >> w;
graph.addEdge(u, v, w);
}
cout << "各个顶点的入度为:" << endl;
graph.calcInDegree();
cout << "深度优先遍历结果为:";
graph.dfsTraversal(1);
cout << "广度优先遍历结果为:";
graph.bfsTraversal(1);
return 0;
}
```
示例输入:
```
请输入顶点数和边数:5 6
请依次输入边的起点、终点和权值:
1 2 1
1 3 2
2 4 3
2 5 4
3 5 5
4 5 6
```
示例输出:
```
各个顶点的入度为:
顶点 1 的入度为 0
顶点 2 的入度为 1
顶点 3 的入度为 1
顶点 4 的入度为 1
顶点 5 的入度为 3
深度优先遍历结果为:1 2 4 5 3
广度优先遍历结果为:1 2 3 4 5
```
阅读全文