用c++写一个完整的源代码
时间: 2023-11-26 11:04:07 浏览: 32
好的,以下是完整的C++源代码实现:
```c++
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
// 定义交通网络图邻接矩阵
int graph[5][5] = {
{0, 1, 3, INT_MAX, INT_MAX},
{1, 0, 2, 5, INT_MAX},
{3, 2, 0, 1, 8},
{INT_MAX, 5, 1, 0, 4},
{INT_MAX, INT_MAX, 8, 4, 0}
};
// 深度优先遍历算法
void dfs(int start, vector<bool>& visited) {
visited[start] = true;
cout << start << " ";
for (int i = 0; i < 5; i++) {
if (graph[start][i] != 0 && !visited[i]) {
dfs(i, visited);
}
}
}
// Prim算法实现最小生成树
void prim() {
// 初始化已有节点集合和未加入节点集合
vector<bool> in_set(5, false);
vector<int> out_set{1, 2, 3, 4};
in_set[0] = true;
// 初始化最小生成树的边和权重
vector<pair<int, int>> edges;
vector<int> weights;
// 重复加入新节点直到所有节点都被加入
while (!out_set.empty()) {
int min_weight = INT_MAX;
pair<int, int> min_edge = make_pair(-1, -1);
// 遍历已有节点集合中的所有节点,查找与未加入节点集合中距离最近的边
for (int i = 0; i < 5; i++) {
if (in_set[i]) {
for (auto j : out_set) {
if (graph[i][j] < min_weight) {
min_weight = graph[i][j];
min_edge = make_pair(i, j);
}
}
}
}
// 将距离最近的节点加入已有节点集合,并从未加入节点集合中删除
in_set[min_edge.second] = true;
out_set.erase(find(out_set.begin(), out_set.end(), min_edge.second));
// 将边加入最小生成树的边集合中
edges.push_back(min_edge);
weights.push_back(min_weight);
}
// 输出最小生成树的边和权重
for (int i = 0; i < edges.size(); i++) {
cout << "(" << edges[i].first << "-" << edges[i].second << "):" << weights[i] << endl;
}
}
int main() {
// 测试深度优先遍历算法
vector<bool> visited(5, false);
dfs(0, visited);
cout << endl;
// 测试Prim算法
prim();
return 0;
}
```
注意,这里使用了C++的STL库中的vector和queue等容器,以及算法库中的find函数等。需要在编译时加上`-std=c++11`选项才能编译通过。