📅  最后修改于: 2023-12-03 14:59:52.050000             🧑  作者: Mango
C++标准模板库(STL)是C++的一个核心组成部分,它提供了许多容器类和算法,这些类和算法大大简化了C++程序员的编程工作。其中,多图是STL提供的一个重要容器,本文将介绍多图的相关内容。
多图是一种图容器,它可以存储多个有向图或无向图,并提供了一系列的操作函数。多图的定义形式为:
template<typename Key, typename Weight = int>
class MultiGraph {
public:
// ...
};
其中,Key
是图节点的类型,Weight
是边的权重类型,默认为int
类型。多图提供了以下操作函数:
bool add_node(const Key &key)
:添加一个节点,如果已存在则返回false
。size_t node_size() const
:获取节点数量。bool add_edge(const Key &from, const Key &to, const Weight &weight = Weight{})
:添加一条有向边或无向边。bool del_edge(const Key &from, const Key &to)
:删除一条有向边或无向边。bool exist_edge(const Key &from, const Key &to) const
:判断一条有向边或无向边是否存在。std::vector<Key> from(const Key &key) const
:获取以指定节点为起点的所有节点。std::vector<Key> to(const Key &key) const
:获取以指定节点为终点的所有节点。std::vector<std::pair<Key, Weight>> edges(const Key &key) const
:获取以指定节点为起点的所有边,并返回对应节点和边的权重。下面是一个使用多图的示例程序:
#include <iostream>
#include <vector>
#include "MultiGraph.h"
int main() {
MultiGraph<std::string, int> g;
g.add_node("a");
g.add_node("b");
g.add_node("c");
g.add_edge("a", "b");
g.add_edge("b", "a");
g.add_edge("a", "c", 2);
g.add_edge("c", "b", 3);
g.del_edge("a", "b");
std::vector<std::string> nodes = g.from("a");
std::vector<std::pair<std::string, int>> edges = g.edges("c");
std::cout << "node_size = " << g.node_size() << std::endl;
std::cout << "edges from c:" << std::endl;
for (auto iter = edges.begin(); iter != edges.end(); ++iter) {
std::cout << iter->first << " " << iter->second << std::endl;
}
std::cout << "nodes from a:" << std::endl;
for (auto iter = nodes.begin(); iter != nodes.end(); ++iter) {
std::cout << *iter << std::endl;
}
return 0;
}
上述程序定义了一个字符串类型的多图,并向其中添加了三个节点:“a”、“b”、“c”,以及四条边:“a”到“b”、“b”到“a”、“a”到“c”、“c”到“b”。然后,程序删除了一条边:“a”到“b”,并用from
和edges
函数获取了“a”的出边和“c”的入边。最后,程序输出了节点数和对应的节点/边信息。
程序运行结果如下:
node_size = 3
edges from c:
b 3
nodes from a:
c
多图适用于需要存储多个有向图或无向图,并对其进行访问和操作的情况。多图的操作函数类别丰富,适用于多种场景,例如拓扑排序、最短路径、最小生成树等。
多图是STL中一个重要的图容器,它提供了丰富的操作函数,适用于多种场景。使用多图可以大大简化C++程序员的编程工作。