[文章目录]
Description
某理科试验班有n个人,现在班主任要从中选出尽量多的人去参加一次太空旅行活动。这n名同学,由于是理科生,都非常的理性,所以“朋友的朋友就是朋友”和“敌人的朋友就是敌人”这两句话对这些同学无效。换句话说,有可能小A和小B是朋友,小B和小C是朋友,但是小A和小C两人势如水火。任意两个人之间要不就是敌人,要不就是朋友。选出来参加旅行活动的同学必须互相之间都是朋友。你的任务就是确定最多可以选多少人参加旅行。n(1<=n<=50)
求最大团好像有一个很正经的算法。然而random_shuffle直接就过了。。。不要问我为什么。。。好像有道题求最大团也是,这么过的。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int ans,n,a[60],z[60],top;
bool map[60][60];
int main()
{
scanf("%d",&n); int x,y;
while(~scanf("%d%d",&x,&y)) map[x][y]=map[y][x]=1;
for(int i=1;i<=n;++i) a[i]=i;
int t=1000,fl;
while(t--)
{
top=0; random_shuffle(a+1,a+n+1);
for(int i=1;i<=n;++i)
{
fl=1;
for(int j=1;j<=top;++j) fl&=map[a[i]][z[j]];
if(fl) z[++top]=a[i];
}
ans=max(ans,top);
}
printf("%d",ans);
return 0;
}