프로그래밍[Univ]/알고리즘

[알고리즘] 탐욕적 알고리즘 Part 2 - 최소신장트리 Phase 1

Cloud Travel 2011. 11. 17. 20:16

* 용어 설명


 - 위의 그래프 G1은 무방향 가중치 연결 그래프를 나타내고 있다.

 - 순환경로(cycle) : 시작하는 정점과 끝나는 정점이 같은 것
  ※ 여기서 경로란? 한 정점에서 다른 정점으로 가는 길을 말한다.

 - 부분그래프 : 그래프 중에서 일부분을 나타낸 것

 - 트리 : 연결 되어 있고 순환 경로가 없는 그래프

 - 신장트리 : 그래프의 부분 그래프 중에서 본래 그래프의 모든 정점을
                 가지고 있으며, 트리가 되는 것 

 - 최소비용 신장 트리: 신장트리들 중에서 가중치가 가장 적은 트리 

* 무작정 알고리즘
 - 모든 신장트리를 고려한 후, 그 중에서 비용이 가장 적게되는 것을 선택
 - 분석 : 각 간선은 포함 될수도 있고 안될 수도 있다.(각간선마다 2가지 경우가 존재한다.)
    > 2 * 2 * 2 * ... * 2 = 2^n ∈ 세타의 n^2

* 탐욕적 알고리즘
 - 전략 : 트리에 추가할 연결선들을 반복적으로 선택한다.
             ( 한 연결선이 좋은지를 쉽게 판단가능 하다 )
 - 한 연결선이 선택되면 그 연결선의 종점들을 합친다.
  ex)
     

     > 여기서 3과 4를 선택한 것은 좋을 수도 있고 나쁠 수도 있다.
  - 탐욕적 알고리즘을 적용하기 적절한 이유
   > 정점 a와 b가 연결된다면, 정점 a에 연결하는 것은 정점 b에 연결하는 것과 같다.
   > 즉, a와 b가 연결되있다는 것은 다른 정점에서 a에 갈 수 있다는 것은 b로도 갈수 있다는 것이고,
      이의 역인 다른 정점에서 b로 갈수 있다는 것은 a로도 갈수 있다는 이야기이다.
 - 사용할 사실(명제)  
  > 한 그래프 G는 (n-1)개의 연결선들을 가지고, 순환 경로가 없으면 트리라고 할수 있다.
  > 또한 G가 트리이면 그 안에 (n-1)개의 연결선들이 있고, 비순환그래프이다.
 - 명제 정리
  > 연결선 e가 정점 v에 접합한 가장 가벼운 (가중치가 작은) 연결선이라고 하자.
     그러면 e를 포함하는 최소비용 신장 트리가 있다고 할 수 있다. 
 - 전략
  > 종점 지향 전략 (Prim의 알고리즘) 
   - 처음 시작할 때 임의의 한 정점 V0를 선택한다.
   - V0에서 나가는 가장 가벼운 연결선을 선택한다. 그 연결선이 (V0, x)라고하면 그것을 최소신장 트리 T에
     추가를 하고 V0와 x를 합친다. 모든 정점이 T에 포함될때까지 이 과정을 반복한다.
   ex) 다음의 최소 신장 트리를 구하여라

 


 ⓐ V1에서 시작한다.
 ⓑ V2가 V1에서 가장 가까으므로 V2를 선택한다.
 ⓒ V3가 {V1,V2}에서 가장 가까으므로 V3를 선택한다.
     연결선 (V1,V3)와 (V2,V3)의 가중치가 같으므로 아무것이나
     선택한다.(V1,V3)을 선택하기로 한다.
 ⓓ V5가 {V1,V2,V3}에 가장 가까우므로 V5를 선택한다.
 ⓔ V4를 선택한다. 연결선 (V3,V4)가 가장 가까우므로 T에 추가한다.
 
 > 최소신장 트리가 만들어 졌다.
 > 다음 그림은 과정별로 나타나는 최소신장트리와 그래프의 변화이다. 




  > 연결선 지향 전략 (Kruskal의 알고리즘) 
   - 그래프에 남아 있는 가장 가벼운 연결선을 선택한다.
   - 선택된 연결선이 통합된 두 개의 정점들 사이에 있다면 버린다. 아니면 T에 추가한다.

   ex) 다음의 최소 신장 트리를 구하여라



ⓐ 연결선들을 가중치에 의해 정렬한다.
ⓑ 연결선 (V1,V2)가 가장 가까우므로 선택한다.
ⓒ 연결선 (V3,V5)가 가장 가까우므로 선택한다.
ⓓ 연결선 (V1,V3)와 (V2,V3)가 가장 가까우므로 둘중에 하나를
    선택한다. (V1,V3)를 선택했다.
ⓔ 연결선 (V3,V4)가 가장 가벼우므로 선택한다.
   
 > 최소신장 트리가 만들어 졌다.
 > 다음 그림은 과정별로 나타나는 최소신장트리와 그래프의 변화이다.