📅  最后修改于: 2023-12-03 15:36:37.436000             🧑  作者: Mango
在竞争性编程中,加权图是经常用到的一种数据结构,它是由一些顶点和一些带权重的边组成的。
使用STL可以方便我们实现加权图。下面我们来详细介绍一下如何使用STL进行加权图的实现。
在STL中,可以使用pair来表示一条边,其中第一个元素表示边的起点,第二个元素表示边的终点,如下所示:
pair<int, int> edge = make_pair(1, 2);
对于加权图,我们需要把权重也加入到边中,可以使用pair嵌套pair的方式来实现:
pair<int, pair<int, int>> weighted_edge = make_pair(3, make_pair(1, 2));
其中first表示权重,second表示一条边,其中第一个元素表示边的起点,第二个元素表示边的终点。
使用STL实现加权图,主要涉及到以下几个数据结构:
具体实现如下:
#include <iostream>
#include <vector>
#include <set>
#include <unordered_map>
using namespace std;
int main() {
vector<pair<int, pair<int, int>>> edges; // 存储所有边
set<int> vertices; // 存储顶点集合
unordered_map<int, vector<pair<int, int>>> adjacency_list; // 存储邻接表
// 添加边
edges.push_back(make_pair(3, make_pair(1, 2)));
edges.push_back(make_pair(4, make_pair(2, 3)));
edges.push_back(make_pair(5, make_pair(3, 4)));
// 添加顶点
vertices.insert(1);
vertices.insert(2);
vertices.insert(3);
vertices.insert(4);
// 构建邻接表
for (auto edge : edges) {
adjacency_list[edge.second.first].push_back(make_pair(edge.second.second, edge.first));
adjacency_list[edge.second.second].push_back(make_pair(edge.second.first, edge.first));
}
// 输出邻接表
for (auto vertex : vertices) {
cout << "Vertex " << vertex << " is adjacent to: ";
for (auto adjacency : adjacency_list[vertex]) {
cout << "(vertex " << adjacency.first << ", weight " << adjacency.second << ") ";
}
cout << endl;
}
return 0;
}
使用STL可以方便地实现加权图。上述实现中,vector用于存储所有边,set用于存储顶点集合,unordered_map用于存储邻接表。通过构造邻接表,我们可以方便地遍历所有顶点以及它们相邻的边集合。
如果要对加权图进行进一步处理,我们可以使用STL中的优先队列(priority_queue)来实现最小生成树、最短路径等算法。