나무에 대한 선형 시간 레이블 알고리즘?


12

정점에 레이블을 지정하려는 방향이없는 트리가 있습니다. 리프 노드에는 레이블이 하나 있어야합니다. 그런 다음 나뭇잎이 제거되었다고 가정하십시오. 남아있는 나무에서는 잎에 2를 표시해야합니다. 이 과정은 모든 정점이 레이블을 가질 때까지 계속 진행됩니다. 이 작업을 수행하는 이유는 정점을 대기열에 저장하고 "첫 번째 잎"을 통과하기 때문입니다. 이 O(n+m) 시간 을 수행하는 쉬운 방법이 있습니까?

모든 단계에서 BFS를 수행하여 문제를 해결할 수 있습니다. 그러나 최악의 경우 모든 단계에서 모든 정점을 통과하고 정확히 두 개의 잎을 제거하고 대기열에 넣습니다. 나는 이차 시간이 걸린다고 생각합니다.

또 다른 아이디어는 먼저 모든 잎을 찾은 다음 모든 잎에서 BFS를 수행하는 것이 었습니다. 이것은 나에게 원하는 해결책을주지 않습니다. 예를 들어, 아래 그림과 같이 일종의 "크라운 그래프"를 고려하십시오. 원하는 솔루션이 표시되지만 각 리프에서 BFS를 시작하면 두 개의 레이블 만 사용됩니다.

여기에 이미지 설명을 입력하십시오

이상적으로 선형 시간 알고리즘도 설명하고 구현하기가 쉽습니다.

답변:


8

뿌리없는 나무

우선 순위 대기열을 사용하여 에서이를 해결할 수 있습니다 .O(E+VlogV)

  • 모든 정점을 우선 순위 대기열에 넣고 우선 순위는 정도입니다.
  • 대기열이 비어 있지 않은 동안 :
    • 최소 우선 순위 의 정점 를 제거하십시오. 11 이거나 맨 끝에 0 이어야합니다 .v10
    • σ(v)=1+maxσ(u)uv
    • 남은 고유 이웃의 우선 순위에서 을 뺍니다 (있는 경우).1u

실제로 우선 순위 대기열이 필요하지 않으며이 알고리즘은 시간에 간단한 대기열을 사용하여 구현할 수 있습니다 .O(E+V)

  • 모든 정점의 차수로 길이 의 배열을 초기화합니다 .V
  • "alive"를 사용하여 길이 의 다른 배열을 초기화하십시오 .V
  • 첫 번째 배열을 통해 한 번 이동 한 정도의 모든 꼭지점 밀어 큐로.1
  • 대기열이 비어 있지 않은 동안 :
    • 꼭짓점 팝합니다 .v
    • 하자 여기서 모두 원래 이웃 넘어 .σ(v)=1+maxσ(u)uv
    • 마크 "죽은"로.v
    • 경우 일부 "살아"이웃이 , 빼기 정도에서 .vu1u
    • 의 새 차수 가 이면 를 대기열로 밉니다 .u1u

뿌리 나무

대신 DFS를 사용하십시오. 다음은 알고리즘의 스케치입니다.

  • 노드 주어지면 , 가 잎이면 .vvd(v)=1
  • 가 잎이 아닌 경우 모든 자식에 대해 알고리즘을 실행 한 다음 . 여기서 는 모든 자식 집합을 넘어갑니다.vd(v)=1+maxd(u)u

이 알고리즘을 루트에서 실행합니다.


이게 옳은 거니? 트리 1-> 2-> 3-> 4-> 5를 고려하십시오. 여기서 1은 루트입니다. 2는 레이블 1을 가져와야하지만 3을 제공합니까? 아니면 아이들이란 이웃을 의미합니까? 그때 어느 노드에서 df를 시작합니까?
Knoothe

내 구현은 "하나씩 꺼져 있지만"설명에 따르면 에는 레이블 가 있어야합니다 , , 을 제거해야하고 만 잎이됩니다. 4 5 4 3 2245432
Yuval Filmus

나는 질문을하지 않았다 :-). 나는 질문을 다음과 같이 해석했다. 모든 잎에 라벨을 붙입니다. 삭제하십시오. 결과 트리에서 반복합니다. 이 경우 트리는 실제로 1-2-3-4-5, 1 단계, 1과 5, 2와 4, 3을 삭제합니다. "크라운 그래프"에 대한 단락을 참조하십시오. 이것은 트리의 중심을 찾는 고전적인 알고리즘 중 하나입니다.
Knoothe

1은 잎이 아닙니다. 잎과는 거리가 멀고 뿌리입니다. 나는 그 질문을 뿌리 나무를 목표로 삼는 것으로 해석했다. 아마도 OP가 응답 할 때까지 기다려야 할 것입니다.
Yuval Filmus

2
@YuvalFilmus는 단지 2 센트를 던지기 위해 되어서는 안 됩니까? 잎은 이고 삭제하면 새 은 이어야 하므로 정점이 잎이되기 전에 몇 개의 레이어를 삭제해야하는지 측정하는 것입니다. min을 사용하면 잎에 인접한 꼭지점이 2가되지만 잎이 삭제되면 잎이 될 수 없습니다. 그 문장에는 잎이 너무 많습니다. 빗자루가 필요합니다. 1 21+max{d(u)}12
Luke Mathieson

2

간단한 대답은 다음과 같습니다.

  • 이것을 유향 그래프로 바꾸십시오. 여기서 각 노드 에서 부모 까지 의 가장자리 있습니다 . 당신은 dag (지시 된 비 주기적 그래프)를 얻는다.u v(u,v)uv

  • 위상 적으로 그래프를 정렬합니다.

  • 정점을 정렬 된 순서대로 스캔하십시오. 각 정점에 이전 버전의 가장 큰 레이블 중 하나 이상을 레이블로 지정하십시오. 위상 순서 우린 스캔 이후의 전임자의 모든 우리가 라벨에 시도하기 전에 이미 라벨을받은 것 .vvv

이러한 각 단계는 시간 에 수행 할 수 있으므로 총 실행 시간은 입니다. 나는 Yuval의 대답보다 개념적으로 이해하기 쉬운 경우에만이 대안을 언급합니다.O ( n + m )O(n+m)O(n+m)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.