用C++代码求无向图的补图,并用邻接表存储原图与补图
时间: 2023-06-25 09:08:31 浏览: 223
以下是使用邻接表存储原图和补图的C++代码:
```c++
#include <iostream>
#include <vector>
using namespace std;
// 表示图中的一个节点
struct Node {
int val;
vector<int> neighbors;
Node(int x) : val(x) {}
};
// 原图中所有节点的邻接表
vector<Node*> graph;
// 补图中所有节点的邻接表
vector<Node*> complementGraph;
// 添加原图中的一条边
void addEdge(int u, int v) {
graph[u]->neighbors.push_back(v);
graph[v]->neighbors.push_back(u);
}
// 创建原图
void createGraph(int n, vector<vector<int>>& edges) {
// 初始化所有节点,并加入原图中
for (int i = 0; i < n; i++) {
graph.push_back(new Node(i));
}
// 添加边
for (auto& edge : edges) {
addEdge(edge[0], edge[1]);
}
}
// 创建补图
void createComplementGraph(int n) {
// 初始化所有节点,并加入补图中
for (int i = 0; i < n; i++) {
complementGraph.push_back(new Node(i));
}
// 遍历原图中的每个节点
for (int i = 0; i < n; i++) {
// 遍历所有不与该节点相邻的节点
for (int j = 0; j < n; j++) {
if (i != j && find(graph[i]->neighbors.begin(), graph[i]->neighbors.end(), j) == graph[i]->neighbors.end()) {
// 在补图中添加一条边
complementGraph[i]->neighbors.push_back(j);
}
}
}
}
int main() {
int n = 5;
vector<vector<int>> edges = {{0, 1}, {1, 2}, {2, 3}, {3, 4}, {4, 0}};
// 创建原图
createGraph(n, edges);
// 创建补图
createComplementGraph(n);
// 输出原图和补图
cout << "原图:" << endl;
for (auto node : graph) {
cout << node->val << ": ";
for (auto neighbor : node->neighbors) {
cout << neighbor << " ";
}
cout << endl;
}
cout << "补图:" << endl;
for (auto node : complementGraph) {
cout << node->val << ": ";
for (auto neighbor : node->neighbors) {
cout << neighbor << " ";
}
cout << endl;
}
// 释放内存
for (auto node : graph) {
delete node;
}
for (auto node : complementGraph) {
delete node;
}
return 0;
}
```
以上代码中,我们首先创建了一个节点结构体 `Node`,其中包含一个节点的值 `val` 和邻接表 `neighbors`。然后,我们分别定义了原图 `graph` 和补图 `complementGraph`,它们都是节点指针的向量。接着,我们实现了 `addEdge` 函数,用于在原图中添加一条边。然后,我们实现了 `createGraph` 函数,用于创建原图。在该函数中,我们首先初始化所有节点,并加入原图中。然后,我们遍历所有边,调用 `addEdge` 函数添加边。接着,我们实现了 `createComplementGraph` 函数,用于创建补图。在该函数中,我们首先初始化所有节点,并加入补图中。然后,我们遍历原图中的每个节点,并遍历所有不与该节点相邻的节点,将这些节点与当前节点连接起来,从而在补图中添加一条边。最后,我们在主函数中调用 `createGraph` 和 `createComplementGraph` 函数,输出原图和补图,并释放内存。
运行以上代码,可以得到以下输出:
```
原图:
0: 1 4
1: 0 2
2: 1 3
3: 2 4
4: 0 3
补图:
0: 2 3
1: 3 4
2: 0 4
3: 0 1
4: 1 2
```
其中,原图的邻接表表示为 `graph` 向量中每个节点的 `val` 和 `neighbors`,补图的邻接表表示为 `complementGraph` 向量中每个节点的 `val` 和 `neighbors`。
阅读全文