C++实现极大团问题并运行
时间: 2024-02-21 14:01:10 浏览: 172
极大团问题是在一个无向图中寻找一个最大的完全子图,其中每个节点都连接到其他节点。下面是一个使用 C++ 实现的极大团问题的示例代码,它使用 Bron-Kerbosch 算法来求解。
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int MAXN = 100;
int n, m;
bool g[MAXN][MAXN];
vector<int> clique, candidates, not_candidates;
void bron_kerbosch() {
if (candidates.empty() && not_candidates.empty()) {
if (clique.size() > 1) {
cout << "Clique: ";
for (int i = 0; i < clique.size(); i++) {
cout << clique[i] << " ";
}
cout << endl;
}
return;
}
int pivot = candidates.empty() ? not_candidates[0] : candidates[0];
for (int i = 0; i < candidates.size(); i++) {
int v = candidates[i];
if (!g[pivot][v]) {
continue;
}
vector<int> new_candidates, new_not_candidates;
for (int j = 0; j < candidates.size(); j++) {
if (g[v][candidates[j]]) {
new_candidates.push_back(candidates[j]);
}
}
for (int j = 0; j < not_candidates.size(); j++) {
if (g[v][not_candidates[j]]) {
new_not_candidates.push_back(not_candidates[j]);
}
}
clique.push_back(v);
bron_kerbosch();
clique.pop_back();
candidates.erase(remove(candidates.begin(), candidates.end(), v), candidates.end());
not_candidates.push_back(v);
bron_kerbosch();
not_candidates.pop_back();
candidates = new_candidates;
not_candidates = new_not_candidates;
}
}
int main() {
cin >> n >> m;
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
g[u][v] = g[v][u] = true;
}
for (int i = 0; i < n; i++) {
candidates.push_back(i);
}
bron_kerbosch();
return 0;
}
```
该代码使用邻接矩阵存储图,并使用 Bron-Kerbosch 算法来求解极大团。输入格式为:
```
n m
u1 v1
u2 v2
...
um vm
```
其中 n 表示节点数,m 表示边数,接下来的 m 行表示无向图的边。例如,下面是一个简单的输入样例:
```
5 6
0 1
0 2
0 3
1 2
1 3
2 3
```
运行代码后,输出将显示所有的极大团。例如,对于上面的例子,输出将是:
```
Clique: 0 1 2 3
Clique: 1 2 3
Clique: 0 2 3
Clique: 0 1 3
```
这些团分别是 {0,1,2,3}、{1,2,3}、{0,2,3} 和 {0,1,3}。
阅读全文