bzoj3632 外太空旅行 随机化

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

猜你喜欢

转载自blog.csdn.net/jpwang8/article/details/81433442