洛谷 P4212 外太空旅行
阿新 • • 發佈:2018-02-20
一次 但是 為什麽 region 發生 log n) for 二分圖
題目描述
在人類的觸角伸向銀河系的邊緣之際,普通人上太空旅行已經變得稀松平常了。某理科試驗班有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 外太空旅行