http://poj.org/problem?id=1419 (题目链接)
题意
求一般图最大独立集。
Solution
最大独立集=补图的最大团。
代码
// poj1419 #include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<cmath> #include<queue> #define LL long long #define inf 2147483640 #define Pi acos(-1.0) #define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout); using namespace std; const int maxn=200; int f[maxn][maxn],c[maxn][maxn],p[maxn],ans[maxn],mx[maxn]; int n,m,cnt; void Init() { memset(f,1,sizeof(f));cnt=0; for (int i=1;i<=n;i++) c[0][i]=1; } void record(int s) { cnt=s; for (int i=1;i<=s;i++) ans[i]=p[i]; } void dfs(int fa,int x,int s) { if (n-x+s<cnt || s+mx[x+1]<cnt) return; //cut p[s]=x; if (cnt<s) record(s); for (int i=x+1;i<=n;i++) if (c[fa][i] && f[x][i]) c[x][i]=1; for (int i=x+1;i<=n;i++) if (c[fa][i] && f[x][i]) dfs(x,i,s+1); for (int i=x+1;i<=n;i++) c[x][i]=0; } int main() { int T;scanf("%d",&T); while (T--) { scanf("%d%d",&n,&m); Init(); for (int u,v,i=1;i<=m;i++) { scanf("%d%d",&u,&v); f[u][v]=f[v][u]=0; } for (int S=n;S>=1;S--) { //倒着搜索 dfs(0,S,1); mx[S]=cnt; //记忆化一下 } printf("%d\n",cnt); for (int i=1;i<=cnt;i++) printf("%d ",ans[i]); puts(""); } return 0; }
时间: 2024-10-18 18:46:21