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 */
河田は河田、赤木は赤木……。
私は誰ですか。教えてください、私は誰ですか。
そうだ、俺はあきらめない男、三井寿だ!