Description
在人类的触角伸向银河系的边缘之际,普通人上太空旅行已经变得稀松平常了。某理科试验班有n个人,现在班主任要从中选出尽量多的人去参加一次太空旅行活动。
可是n名同学并不是和平相处的。有的人,比如小A和小B整天狼狈为奸,是好朋友;但还有的人,比如杜鲁门和赫鲁晓夫就水火不相容。这n名同学,由于是理科生,都非常的理性,所以“朋友的朋友就是朋友”和“敌人的朋友就是敌人”这两句话对这些同学无效。换句话说,有可能小A和小B是朋友,小B和小C是朋友,但是小A和小C两人势如水火。
任意两个人之间要不就是敌人,要不就是朋友。
因为在太空船上发生人员斗殴事件是很恶劣也很危险的,因此选出来参加旅行活动的同学必须互相之间都是朋友。你的任务就是确定最多可以选多少人参加旅行。
n<=50
Solution
一个优秀做法就是蒙特卡洛,其实还可以状压来着
我们随机一个顺序,然后贪心地选即可
Code
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define rep(i,st,ed) for (int i=st;i<=ed;++i)
const int N=205;
int rec[N][N],a[N],ans;
bool vis[N];
void solve(int n) { int ret=0;
rep(i,1,n) vis[i]=0;
rep(i,1,n) if (!vis[a[i]]) {
rep(j,1,n) if (!rec[a[i]][a[j]]) {
vis[a[j]]=1;
}
ret++;
}
ans=std:: max(ans,ret);
}
int main(void) {
int n; scanf("%d",&n);
for (int x,y;~scanf("%d%d",&x,&y);) {
rec[x][y]=rec[y][x]=1;
}
rep(i,1,n) a[i]=i;
rep(i,1,1000) {
std:: random_shuffle(a+1,a+n+1);
solve(n);
}
printf("%d\n", ans);
return 0;
}