题意
给出一个无向图,求最大团。
n<=50
分析
据说正解是搜索,但为什么不用随机化呢?
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=55;
int n,a[N],ans;
bool vis[N],map[N][N];
void work()
{
for (int i=1;i<=n;i++) swap(a[i],a[rand()%n+1]);
memset(vis,0,sizeof(vis));
int s=0;
for (int i=1;i<=n;i++)
if (!vis[i])
{
s++;
for (int j=i+1;j<=n;j++)
if (!map[a[i]][a[j]]) vis[j]=1;
}
ans=max(ans,s);
}
int main()
{
scanf("%d",&n);
int x,y;
while (scanf("%d%d",&x,&y)!=EOF) map[x][y]=map[y][x]=1;
for (int i=1;i<=n;i++) a[i]=i;
for (int i=1;i<=10000;i++) work();
printf("%d",ans);
return 0;
}