邻接表存储带权无向图
时间: 2025-01-20 15:00:46 浏览: 45
### 使用邻接表表示和存储带权无向图
对于带权无向图而言,邻接表是一种高效的数据结构来表示这种类型的图。相比于邻接矩阵,在稀疏图的情况下可以节省大量的空间。
#### 结构体定义
为了有效地管理节点及其连接关系,通常会设计两个主要的结构体:一个是用于保存顶点的信息;另一个则是用来记录边的相关数据,特别是权重信息。下面是一个简单的 C++ 实现:
```cpp
struct Edge {
int dest; // 边的目标结点索引
int weight; // 边的权重
};
class Graph {
private:
std::vector<std::list<Edge>> adjLists;
public:
void addEdge(int src, int dest, int weight);
};
```
这里 `adjLists` 是一个动态数组,其中每一个元素都是一个链表列表,代表从该位置出发的所有可能到达的目的地以及相应的距离或成本[^3]。
#### 创建并初始化图形对象
当创建一个新的图形实例时,默认情况下它不包含任何边缘。因此,需要提供一种机制让用户能够添加新的边到这个图表中去。这可以通过成员函数 `addEdge()` 来完成:
```cpp
void Graph::addEdge(int src, int dest, int weight){
Edge edge = {dest, weight}; // 定义一条新边
this->adjLists[src].push_back(edge); // 将其加入源节点的邻接表
// 因为这是个无向图所以还需要反向添加这条边
edge.dest = src;
this->adjLists[dest].push_back(edge);
}
```
这段代码实现了双向链接的关系,即如果存在 A -> B 的路径,则也必然存在着 B -> A 的路径,并且两者具有相同的权重值。
#### 输出邻接表
要查看当前图的状态,可以通过遍历整个邻接表并将每一项打印出来的方式来进行展示:
```cpp
void displayGraph(const Graph& graph) {
for (size_t i = 0; i < graph.adjLists.size(); ++i) {
cout << "Node " << i << ": ";
for(auto it : graph.adjLists[i]){
cout << "(" << it.dest << ", w=" << it.weight << ") ";
}
cout << endl;
}
}
```
此段代码将会逐行显示每个节点所指向的所有其他节点连同它们之间的权重。
阅读全文
相关推荐















