最大团在考试的时候用随机化+贪心正确性还是很高的,而且能轻而易举拓展到n=200及以上。
而DFS算法则可以看做是dfs优化的经典题目。
算法传送门:http://www.cnblogs.com/zhj5chengfeng/archive/2013/07/29/3224092.html
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define MAXN 102 #define MAXM 100000 int e[2][MAXM][2]; int map[MAXN][MAXN]; int q[MAXN],topq; int next[MAXN]; int n,m; int work() { topq=0; q[0]=0; int i,j; bool flag; for (i=1;i<n;i++) { flag=true; for (j=0;j<=topq;j++) { if (!map[i][q[j]]) { flag=false;break; } } if (flag) { q[++topq]=i; } } return topq+1; } int main() { freopen("input.txt","r",stdin); // freopen("output.txt","w",stdout); scanf("%d",&n); int i,j,k; int x,y,z; i=0; while (~scanf("%d%d",&e[1][i][0],&e[1][i][1])) { e[1][i][0]--; e[1][i][1]--; if (map[e[1][i][0]][e[1][i][1]])continue; m++; i++; } int ans=0; int cnt=0; while (cnt++<20000) { memset(map,0,sizeof(map)); for (i=0;i<m;i++) { map[e[cnt&1][i][0]][e[cnt&1][i][1]]=map[e[cnt&1][i][1]][e[cnt&1][i][0]]=true; } ans=max(ans,work()); for (i=0;i<n;i++) next[i]=i; for (i=0;i<n;i++) { x=rand()%n; y=rand()%n; swap(next[x],next[y]); } for (i=0;i<m;i++) { for (j=0;j<2;j++) { e[cnt&1^1][i][j]=next[e[cnt&1][i][j]]; } } } printf("%d\n",ans); }
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define MAXN 102 #define MAXM 100000 int e[MAXM][2]; int map[MAXN][MAXN]; int n,m; int s[MAXN][MAXN]; int tops[MAXN]; int l[MAXN],topl=-1; int ans=0; int rec[MAXN]; int dfs(int lev) { int i,j; int x; if (lev>ans) { ans=lev; return 1; } if (lev+tops[lev]+1<=ans)return 0; for (i=0;i<=tops[lev];i++) { x=s[lev][i]; tops[lev+1]=-1; if (i<tops[lev]&&lev+1+rec[s[lev][i+1]]<=ans)return 0; for (j=i;j<=tops[lev];j++) { if (map[x][s[lev][j]])s[lev+1][++tops[lev+1]]=s[lev][j]; } l[lev]=x; if (dfs(lev+1))return 1; } return 0; } int main() { freopen("input.txt","r",stdin); //freopen("output.txt","w",stdout); scanf("%d",&n); int i,j,k; int x,y,z; i=0; while (~scanf("%d%d",&e[i][0],&e[i][1])) { e[i][0]--; e[i][1]--; m++; i++; } int cnt=0; memset(map,0,sizeof(map)); for (i=0;i<m;i++) { map[e[i][0]][e[i][1]]=map[e[i][1]][e[i][0]]=true; } for (i=n-1;i>=0;i--) { for (j=i;j<n;j++) s[0][j-i]=j; tops[0]=n-i-1; dfs(0); rec[i]=ans; // cout<<i<<endl; } printf("%d\n",ans); }
转载于:https://www.cnblogs.com/mhy12345/p/3859032.html