BZOJ-3632: 外太空旅行

[文章目录]

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;
}

发表评论

邮箱地址不会被公开。 必填项已用*标注