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=;
bool f=;
char ch=' ';
while(!isdigit(ch))
{
f|=(ch=='-'); ch=getchar();
}
while(isdigit(ch))
{
s=(s<<)+(s<<)+(ch^); ch=getchar();
}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<)
{
putchar('-'); x=-x;
}
if(x<)
{
putchar(x+''); return;
}
write(x/);
putchar((x%)+'');
return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=;
int n,a[N],b[N];
bool Bo[N][N];
inline bool Judge(int x)
{
int i;
for(i=;i<=*b;i++) if(!Bo[b[i]][x]) return false;
return true;
}
int main()
{
int i,j,x,y,ans=;
R(n);
while(~scanf("%d%d",&x,&y)) Bo[x][y]=Bo[y][x]=;
for(i=;i<=n;i++) a[i]=i;
for(i=;i<=;i++)
{
random_shuffle(a+,a+n+);
*b=;
for(j=;j<=n;j++) if(Judge(a[j])) b[++*b]=a[j];
ans=max(ans,(int)*b);
if(*b==n) break;
}
Wl(ans);
return ;
}
/*
input
4
1 2
2 3
3 1
1 4
output
3
*/
05-11 22:34