用c++实现定义一有n个结点的的以邻接矩阵为存储方式的网(有向或无向均可),并对其进行如下操作: 1.深度优先遍历,并输出遍历序列; 2.广度优先遍历,并输出遍历序列; 3.求源点到图中每个点的最短路径,并输出;
时间: 2024-03-25 16:40:42 浏览: 103
无向图的邻接矩阵存储及输出
以下是 C++ 代码实现:
```c++
#include <iostream>
#include <queue>
#include <stack>
#include <cstring>
using namespace std;
const int MAXN = 100;
const int INF = 0x3f3f3f3f;
int n; // 点的数量
int e[MAXN][MAXN]; // 邻接矩阵存储图
bool vis[MAXN]; // 标记节点是否被访问过
// 深度优先遍历
void dfs(int u) {
vis[u] = true;
cout << u << " ";
for (int v = 0; v < n; v++) {
if (e[u][v] && !vis[v]) {
dfs(v);
}
}
}
// 广度优先遍历
void bfs(int s) {
queue<int> q;
memset(vis, false, sizeof(vis));
vis[s] = true;
q.push(s);
while (!q.empty()) {
int u = q.front();
q.pop();
cout << u << " ";
for (int v = 0; v < n; v++) {
if (e[u][v] && !vis[v]) {
vis[v] = true;
q.push(v);
}
}
}
}
// Dijkstra算法求最短路径
void dijkstra(int s) {
int dist[MAXN]; // 存储源点到各个点的最短距离
bool vis[MAXN]; // 标记节点是否已经加入S集合
memset(vis, false, sizeof(vis));
for (int i = 0; i < n; i++) {
dist[i] = INF;
}
dist[s] = 0;
for (int i = 1; i < n; i++) {
int u = -1;
for (int j = 0; j < n; j++) {
if (!vis[j] && (u == -1 || dist[j] < dist[u])) {
u = j;
}
}
vis[u] = true;
for (int v = 0; v < n; v++) {
if (e[u][v] && !vis[v]) {
dist[v] = min(dist[v], dist[u] + e[u][v]);
}
}
}
cout << "源点到各点的最短距离为:" << endl;
for (int i = 0; i < n; i++) {
cout << s << "到" << i << "的最短距离为:" << dist[i] << endl;
}
}
int main() {
cout << "请输入节点数:";
cin >> n;
cout << "请输入邻接矩阵:" << endl;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> e[i][j];
}
}
// 深度优先遍历
memset(vis, false, sizeof(vis));
cout << "深度优先遍历:";
for (int i = 0; i < n; i++) {
if (!vis[i]) {
dfs(i);
}
}
cout << endl;
// 广度优先遍历
memset(vis, false, sizeof(vis));
cout << "广度优先遍历:";
for (int i = 0; i < n; i++) {
if (!vis[i]) {
bfs(i);
}
}
cout << endl;
// Dijkstra算法求最短路径
cout << "请输入源点编号:";
int s;
cin >> s;
dijkstra(s);
return 0;
}
```
需要注意的是,以上实现中的图默认为无向图。如果是有向图,需要在读入邻接矩阵时注意。
阅读全文