원활 한 공사 (및 조사 집합)

[제목] 모 성에 서 도시 교통 상황 을 조사 하고 기 존의 도시 도로 통계 표를 얻어 서 표 에 모든 도로 가 직접 연 결 된 도 시 를 열거 했다.성 정부의 '원활 한 공사' 목 표 는 성 전체의 어느 두 도시 간 에 도 교통 을 실현 할 수 있 도록 하 는 것 이다.-- 최소한 몇 개의 도 로 를 더 건설 해 야 하나.[해답] 기본 알고리즘 을 찾 습 니 다.배열 parent 를 정의 합 니 다. 각 도 시 는 배열 로 표 시 를 할 수 있 습 니 다. parent [index] 의 값 은 index 와 연 결 된 도 시 를 대표 합 니 다.
코드:
    int[] parent = new int[5];

    public int findRoot(int x)
    {
        int r = x;
        //     root == parent[root]
        while (r != parent[r])
            r = parent[r];
        return r;
    }
    public void Merge(int x, int y)
    {
        int p , q;
        p = findRoot(x);
        q = findRoot(y);
        if (p != q) { //    
                parent[x] = q;
        }
    }

상기 코드 는 기본 기능 을 현실 화 시 켰 기 때문에 우 리 는 최 적 화 를 할 수 있다.최적화 해 야 할 것 은 이 알고리즘 에서 사용 빈도 가 가장 높 은 방법, 즉 루트 노드 를 찾 는 방법 (findRoot) 이다.
1. 높이 가 작은 나 무 를 높이 가 큰 나무 위 에 합 친 코드 에서 두 나 무 는 임의로 합 친 것 입 니 다. 속도 가 더 높 은 것 을 찾기 위해 서 는 나무 전체 가 가능 한 한 균형 을 유지 해 야 합 니 다.두 나무의 높이 가 h1, h2 라 고 가정 하면 합 친 높이 h 는:
  • if(h1 != h2) h = max(h1, h2)
  • if(h1 == h2) h = h1+1

  • 2. 경 로 를 압축 하여 루트 노드 (r = parent [r]) 를 찾 고 경로 의 모든 노드 를 수정 하여 루트 노드 를 가리킨다.
    최 적 화 된 코드:
        int[] parent = new int[5]; //      ,            
        int[] height = new int[5]; //      
    
        public int findRoot(int x)
        {
    
            int r = x;
            while (r != parent[r])
                r = parent[r];
    
            int i = x, j;
            //    
            while (i != r)
            {
                j = parent[i];
                parent[i] = r;
                i = j;
            }
    
            return r;
        }
        public void Merge(int x, int y)
        {
            int p , q;
            p = findRoot(x);
            q = findRoot(y);
            if (p != q) {
                //              
                if (height[p] == height[q])
                {
                    parent[p] = q;
                    height[q]++;
                }else if (height[p] > height[q]){
                    parent[q] = p;
                }else {
                    parent[p] = q;
                }
            }
        }

    그리고 조사 집 에 대한 상세 한 소 개 는 이 글 을 참조 하 시기 바 랍 니 다.http://blog.csdn.net/dm_vincent/article/details/7655764

    좋은 웹페이지 즐겨찾기