📜  使用STL进行竞争性编程实现图形实现|设置2(加权图)(1)

📅  最后修改于: 2023-12-03 15:36:37.436000             🧑  作者: Mango

使用STL进行竞争性编程实现图形实现|设置2(加权图)

在竞争性编程中,加权图是经常用到的一种数据结构,它是由一些顶点和一些带权重的边组成的。

使用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实现加权图,主要涉及到以下几个数据结构:

  • vector:用于存储图的所有边
  • set:用于存储顶点集合
  • unordered_map:用于存储邻接表,其中key表示顶点,value表示与该顶点相邻的边集合

具体实现如下:

#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)来实现最小生成树、最短路径等算法。