题目描述
在人类的触角伸向银河系的边缘之际,普通人上太空旅行已经变得稀松平常了。某理科试验班有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; }
原文地址:https://www.cnblogs.com/JYYHH/p/8455576.html
时间: 2024-10-11 06:10:43