原意是求图的最大独立集,不是二部图的话是NP问题,转化成求补图的最大图 保存搜索结果时,忘记回溯,WA了两次 代码: #include<iostream> #include<cstdio> #include<memory.h> using namespace std; const int MAX=105; int g[MAX][MAX],c[MAX],res[MAX],black[MAX]; int n,m,maxx,x; bool dfs(int u[],int size,int total) { int i,j,k,t[MAX]; if(total==0) { if(maxx<size) { maxx=size; for(i=0;i<x;i++) black[i]=res[i]; return true; } return false; } for(i=0;i<total;i++) { if(size+total-i<=maxx) return false; if(size+c[u[i]]<=maxx) return false; k=0; res[x++]=u[i]; for(j=i+1;j<total;j++) { if(g[u[i]][u[j]]) t[k++]=u[j]; } if(dfs(t,size+1,k)) return true; x--;//回溯 } return false; } void solve() { int i,j,k; int u[MAX]; maxx=0; for(i=n;i>=1;i--) { k=x=0; for(j=i+1;j<=n;j++) { if(g[i][j]) u[k++]=j; } res[x++]=i; dfs(u,1,k); c[i]=maxx; } cout<<maxx<<endl; for(i=0;i<maxx;i++) { cout<<black[i]; if(i!=maxx-1) cout<<" "; } cout<<endl; } int main() { int i,j,T; scanf("%d",&T); while(T--) { memset(c,0,sizeof(c)); scanf("%d%d",&n,&m); for(i=1;i<=n;i++) { g[i][i]=0; for(j=i+1;j<=n;j++) g[i][j]=g[j][i]=1; } while(m--) { scanf("%d%d",&i,&j); g[i][j]=g[j][i]=0; } solve(); } return 0; }