洛谷 P4212 外太空旅行

Posted 蒟蒻JHY

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 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的两个同学就是敌人。

 

输出格式:

 

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

 

输入输出样例

输入样例#1: 
4
1 2
2 3
3 1
1 4
输出样例#1: 
3

一个很简单的转化就是把最大团变成补图的最大独立集(就是把不能共存看成边的话,选出的一定得是独立集)、、、、
然后这也不是二分图啊,,,,,,,好像是个NP问题。。。。
但是记得啥时候听说过怼np问题可以用随机化来着。。。。。然后就打了一个随机排列插入独立集,,,(为什么这样就A了hhhh)

#include<bits/stdc++.h>
#define ll long long
using namespace std;
bool a[55][55],v[55];
int n,m,uu,vv;
int ans=0,p[55];
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++) p[i]=i;
    while(scanf("%d%d",&uu,&vv)==2) a[uu][vv]=a[vv][uu]=1;
    
    int T=50000000/n/n;
    while(T--){
        random_shuffle(p+1,p+n+1);
        
        int now=0;
        memset(v,0,sizeof(v));
        
        for(int i=1;i<=n;i++){
            if(v[p[i]]) continue;
            v[p[i]]=1;
            now++;
            
            for(int j=1;j<=n;j++) if(!a[p[i]][j]) v[j]=1; 
        }
        
        ans=max(ans,now);
    }
    
    printf("%d\n",ans);
    
    return 0;
}

  

 

以上是关于洛谷 P4212 外太空旅行的主要内容,如果未能解决你的问题,请参考以下文章

71岁的亿万富翁坐自家飞船成功游览太空!此前已为太空旅行砸了超10亿美元

人类首次商业太空行走敲定!马斯克SpaceX宣布新一轮太空旅行计划,美国富豪成回头客...

洛谷 P2762 太空飞行计划问题

洛谷 P2762 太空飞行计划问题

洛谷P1522牛的旅行——floyd

洛谷 P1515 旅行