2015-01-19 3 views
0

내 코드가 공용품 찾기 알고리즘을 구현하려고하는데 id [] 배열과 sz [] 배열이 있습니다. Union-Find 생성자에서 초기화하지만 Union-Find 클래스의 메서드에서 해당 배열을 사용하려고하면 모든 배열 값이 1로 변경됩니다. 이유를 알 수 없습니다. 내가 빠진 것이 명백한가요?배열 초기화 C++

H 파일

class UnionFind{ 
public: 
    UnionFind(int size); 
    void join(int x, int y); 
    int connected(int x, int y); 
    int find(int x); 

private: 

    int size; 
    int id[]; 
    int sz[]; 

}; 

CPP 코멘트에서

UnionFind::UnionFind(int size){ 
     this->id[size] = id[size]; 
     for(int i = 0; i < size; i++){ 
      id[i] = i; 
     } 
     for(int i = 0; i < size; i++){ 
      sz[i] = 1; 
     } 
    } 

    int UnionFind::find(int l){ 
     //Path Compression Finding the Root 
     for(int i = 0; i < 5; i++){ 
     } 
     while(l != id[l]){ 
      id[l] = id[id[l]]; 
      l = id[l]; 
     } 
     return l; 

    } 

    void UnionFind::join(int x, int y){ 
     int m = find(x); 
     int n = find(y); 

     if(sz[m] < sz[n]){ 
      id[m] = n; 
      sz[n] += sz[m]; 
     } 
     else{ 
      id[n] = m; 
      sz[m] += sz[n]; 
     } 
    } 

    int UnionFind::connected(int x, int y){ 
     if(find(x) == find(y)){ 
      return 1; 
     } 
     else{ 
      return 0; 
     } 
    } 
+1

표준 C++에서는'int id []'와 같은 데이터 멤버를 가질 수 없습니다. – juanchopanza

+0

이 경우 배열 대신'std :: vector'를 사용하십시오. – David

+0

두 가지 관찰 (1) 당신은'size' (2) 멤버를 설정하지 않습니다. – saadtaame

답변

2

파일.

    당신은 클래스 멤버로 int id[]을 가질 수 없습니다
  • ,
  • 사용 std::vector (크기를 조정하고 생성자에 입력),
  • 당신의
  • 하여 찾기 알고리즘은 경로를 사용, 생성자에서 멤버 size을 설정하는 것을 잊었다 경로 압축을 반으로 줄이지는 않습니다 (실행 시간에는 영향을주지 않습니다).

사이드 노트 : 단일 배열/벡터를 사용하여 분리 된 세트 데이터 구조를 구현할 수 있습니다.