如何写出无向带权图的邻接表
时间: 2023-12-01 14:56:50 浏览: 58
无向带权图的邻接表可以用一个数组来表示,数组的每个元素代表图中的一个节点,每个节点包含一个链表,链表中存储了该节点连接的所有节点以及对应的边权重。以下是无向带权图的邻接表的示例代码:
```C++
#include <iostream>
#include <list>
using namespace std;
// 邻接表节点
struct AdjListNode {
int dest; // 目标节点的索引
int weight; // 边的权重
struct AdjListNode* next; // 指向下一个节点的指针
};
// 图中的节点
struct GraphNode {
list<AdjListNode*> adjList; // 相邻节点列表
};
// 图
class Graph {
private:
int V; // 节点的数量
GraphNode* nodes; // 节点数组
public:
Graph(int V) {
this->V = V;
nodes = new GraphNode[V];
}
// 添加边
void addEdge(int src, int dest, int weight) {
// 添加src到dest的边
AdjListNode* node1 = new AdjListNode;
node1->dest = dest;
node1->weight = weight;
node1->next = nullptr;
nodes[src].adjList.push_back(node1);
// 添加dest到src的边
AdjListNode* node2 = new AdjListNode;
node2->dest = src;
node2->weight = weight;
node2->next = nullptr;
nodes[dest].adjList.push_back(node2);
}
// 打印邻接表
void printAdjList() {
for (int i = 0; i < V; i++) {
cout << "Node " << i << ": ";
for (AdjListNode* node : nodes[i].adjList) {
cout << "(" << node->dest << ", " << node->weight << ") ";
}
cout << endl;
}
}
};
int main() {
Graph g(4);
g.addEdge(0, 1, 10);
g.addEdge(0, 2, 20);
g.addEdge(1, 2, 30);
g.addEdge(2, 3, 40);
g.printAdjList();
return 0;
}
```
运行结果:
```
Node 0: (1, 10) (2, 20)
Node 1: (0, 10) (2, 30)
Node 2: (0, 20) (1, 30) (3, 40)
Node 3: (2, 40)
```
阅读全文