luogu4212

P4212 外太空旅行

题目描述

在人类的触角伸向银河系的边缘之际,普通人上太空旅行已经变得稀松平常了。某理科试验班有n个人,现在班主任要从中选出尽量多的人去参加一次太空旅行活动。 可是n名同学并不是和平相处的。有的人,比如小A和小B整天狼狈为奸,是好朋友;但还有的人,比如(政治敏感)和(政治敏感)就水火不相容。这n名同学,由于是理科生,都非常的理性,所以“朋友的朋友就是朋友”和“敌人的朋友就是敌人”这两句话对这些同学无效。换句话说,有可能小A和小B是朋友,小B和小C是朋友,但是小A和小C两人势如水火。 任意两个人之间要不就是敌人,要不就是朋友。 因为在太空船上发生人员斗殴事件是很恶劣也很危险的,因此选出来参加旅行活动的同学必须互相之间都是朋友。你的任务就是确定最多可以选多少人参加旅行。

输入输出格式

输入格式:

 

第一行一个整数n(1<=n<=50)。所有的同学按照1~n编号。 接下来若干行,每行两个用空格隔开的整数a, b(1<=a,b<=n),表示a和b是朋友。 注意:如果一个数对(x,y)(或者(y,x))没有在文件中出现,那么编号为x和y的两个同学就是敌人。

 

输出格式:

 

一个数,即最多可以选多少人参加活动。

 

input
4
1 2
2 3
3 1
1 4
output
3

 

sol:最大团模板题,熟练的选手立刻想到是随机化(然而我并不是)

#include <bits/stdc++.h>
using namespace std;
typedef int ll;
inline ll read()
{
    ll s=0;
    bool f=0;
    char ch=' ';
    while(!isdigit(ch))
    {
        f|=(ch=='-'); ch=getchar();
    }
    while(isdigit(ch))
    {
        s=(s<<3)+(s<<1)+(ch^48); ch=getchar();
    }
    return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
    if(x<0)
    {
        putchar('-'); x=-x;
    }
    if(x<10)
    {
        putchar(x+'0'); return;
    }
    write(x/10);
    putchar((x%10)+'0');
    return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=55;
int n,a[N],b[N];
bool Bo[N][N];
inline bool Judge(int x)
{
    int i;
    for(i=1;i<=*b;i++) if(!Bo[b[i]][x]) return false;
    return true;
}
int main()
{
    int i,j,x,y,ans=0;
    R(n);
    while(~scanf("%d%d",&x,&y)) Bo[x][y]=Bo[y][x]=1;
    for(i=1;i<=n;i++) a[i]=i;
    for(i=1;i<=10000;i++)
    {
        random_shuffle(a+1,a+n+1);
        *b=0;
        for(j=1;j<=n;j++) if(Judge(a[j])) b[++*b]=a[j];
        ans=max(ans,(int)*b);
        if(*b==n) break;
    }
    Wl(ans);
    return 0;
}
/*
input
4
1 2
2 3
3 1
1 4
output
3
*/
View Code

 

posted @ 2019-07-08 21:45  yccdu  阅读(123)  评论(0编辑  收藏  举报