1. 程式人生 > >洛谷 P4212 外太空旅行

洛谷 P4212 外太空旅行

一次 但是 為什麽 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 外太空旅行