回溯解最小顶点覆盖问题C++伪代码
时间: 2024-01-11 15:19:35 浏览: 119
以下是回溯解最小顶点覆盖问题的C++伪代码:
```c++
#include <iostream>
#include <cstring>
using namespace std;
const int N = 20;
int n, m;
int g[N][N];
bool st[N];
int ans = N;
void dfs(int u, int cnt)
{
if (cnt >= ans) return; // 剪枝:如果当前已经选的点数大于等于之前的答案,就不用继续搜索了
if (u == n) // 搜索到叶子节点
{
ans = cnt;
return;
}
// 不选当前节点
dfs(u + 1, cnt);
// 选当前节点
bool flag = true;
for (int i = 0; i < u; i++)
if (g[i][u] && st[i]) // 如果当前节点与之前已选的节点有连边,就不能选
{
flag = false;
break;
}
if (flag)
{
st[u] = true;
dfs(u + 1, cnt + 1);
st[u] = false;
}
}
int main()
{
cin >> n >> m;
while (m--)
{
int a, b;
cin >> a >> b;
g[a][b] = g[b][a] = true;
}
dfs(0, 0);
cout << ans << endl;
return 0;
}
```
阅读全文