求图的最大独立集 最大独立集=补图最大团
很适合理解最大团/最大独立集的模板题
建立补图套模板既可 需要输出集合点 原本想用stack 但发现copy比较麻烦 vector用一个iterator指针 循环很便利
代码如下:
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
bool mp[111][111];
int link[111][111],dp[111],mx;
vector <int> s,ss;
void dfs(int n,int num,int step)
{
int i,j,k,cnt;
if(num == 0)
{
if(mx < step)
{
s.clear();
vector<int>::iterator it = ss.begin();
for(;it != ss.end(); ++it)
s.push_back(*it);
mx = step;
}
return;
}
for(i = 0; i < num; ++i)
{
cnt = 0;
k = link[step][i];
if(step + n - k <= mx) return;
if(step + dp[k] <= mx) return;
for(j = i+1; j < num; ++j) if(mp[link[step][j]][k]) link[step+1][cnt++] = link[step][j];
ss.push_back(k);
dfs(n,cnt,step+1);
ss.pop_back();
}
}
int GetMax(int n)
{
int i,j,sz;
mx = 0;
for(i = n; i >= 1; --i)
{
sz = 0;
for(j = i+1; j <= n; ++j) if(mp[i][j]) link[1][sz++] = j;
ss.push_back(i);
dfs(n,sz,1);
ss.pop_back();
dp[i] = mx;
}
return mx;
}
int main()
{
int t,n,m,u,v,i;
scanf("%d",&t);
while(t--)
{
memset(mp,true,sizeof(mp));
scanf("%d %d",&n,&m);
while(m--)
{
scanf("%d %d",&u,&v);
mp[u][v] = mp[v][u] = false;
}
for(i = 1; i <= n; ++i) mp[i][i] = false;
printf("%d\n",GetMax(n));
vector <int> ::iterator it = s.begin();
for(; it+1 != s.end(); ++it)
printf("%d ",*it);
printf("%d\n",*it);
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-17 08:20:35