2016-06-07 1 views
0

I 그래프에 연합 찾기 수행하는 코드를 작성하고 최대 및 최소 크기 방법 :
nm의 [N 노드의 수이고, m은 I는 각각의 에지가 발생할 때 두 노드입력의 첫 줄이 <br/></p> <p>이산 집합


접속되어 있는지를 나타내는 에지의 수]

그럼 m 라인을 따라는, I는 노드를 연결하기 위해, 연합 동작을 수행한다. 노조를 수행 한 후, 나는 또한 최소 크기의 부분 집합을 얻기 위해 무차별를 사용하고있는 가장 큰 부분 집합의 크기와이 지금까지 내 코드입니다

작은 부분 집합,

#include <iostream> 
using namespace std; 

int arr[100001]; 
int size[100001]; 

void initialize(int n){ 
    for(int i=1; i<=n; i++){ 
     arr[i] = i; 
     size[i] = 1; 
    } 
} 

int root(int a){ 
    while(arr[a] != a){ 
     //Path compression 
     arr[a] = arr[arr[a]]; 
     a = arr[a]; 
    } 
    return a; 
} 

void weighted_union(int a, int b){ 
    int root_a = root(a); 
    int root_b = root(b); 
    //Perform union, if the two elements are not already in the same subset 
    if(root(a) != root(b)){ 
     if(size[root_a] < size[root_b]){ 
      arr[root_a] = root_b; 
      size[root_b] += size[root_a]; 
     } 
     else{ 
      arr[root_b] = root_a; 
      size[root_a] += size[root_b]; 
     } 
    } 
} 

void print_result(int n){ 
    int max_size = 1; 
    int min_size = 100000; 
    for(int i=1; i<=n; i++){ 
     //If it's a root node, then check the size 
     if(arr[i] == i){ 
      if(size[i] > max_size){ 
       max_size = size[i]; 
      } 
      if(size[i] < min_size){ 
       min_size = size[i]; 
      } 
     } 
    } 
    cout<<max_size - min_size<<endl; 
} 

int main() { 
    //For fast IO 
    ios_base::sync_with_stdio(false); 
    cin.tie(NULL); 

    int n,m,a,b; 
    cin>>n>>m; 
    initialize(n); 
    for(int edge=0; edge<m; edge++){ 
     cin>>a>>b; 
     weighted_union(a,b); 
     print_result(n); 
    } 
    return 0; 
} 

을 알고 싶어요 및 최대 크기 서브 세트. 이 코드는 Sphere Online Judge에서 시간 초과되었습니다.

최소 크기의 하위 집합과 최대 크기의 하위 집합을 가져 오는보다 효율적인 방법은 무엇입니까?

SPOJ 질문 링크는 다음과 같습니다 끊긴 세트를 사용 http://www.spoj.com/problems/LOSTNSURVIVED/

답변

0

접근 방식이 옳다. 그러나 복잡성이 제약 조건을 보지 못하도록 O(N*Q)이기 때문에 TLE을 얻고 있습니다. 알고리즘을 최적화하여 O(Q*log(N))을 얻을 수 있습니다. 기본적으로 언제든지 최대 및 최소 크기가 필요합니다. 이는 업데이트 중에 만 변경됩니다. 새로 생성 된 그룹의 크기> 최대인지 여부를 확인하기 만하면 O(1)의 최대 크기를 추적 할 수 있습니다. min의 경우 BST를 사용하여 크기순으로 정렬 된 노드 값을 저장할 수 있습니다. 더 나은 사용 C++ STL set. 당신이하는 모든 조합에 대해 트리에서 두 개의 노드 (쿼리 노드에 해당하는 부모를 의미 함)를 삭제하고 크기가있는 새 부모를 삽입하십시오. 삽입 및 삭제가 O(logN) 시간이 걸리므로 복잡도는 O(QlogN+NlogN)가됩니다. [] [0127] 트리를 만들려면