문제

간격 그래프 및 원호 아크 그래프에 대한 효율적인 알고리즘 간격 모델이 있다고 가정 할 때 간격 그래프에서 Max Clique를 찾는 $ o (n \ log n) $ 알고리즘이 있습니다. 불행히도, 종이 나 참조가 실제로 알고리즘이 알고리즘을 정리하지 않고, 최적의 색칠 간격 그래프를 위해 잘 알려진 알고리즘을 수정할 수 있다는 것입니다 (간격을 정리하여 그래프를 정렬하여 그래프를 잃어버린 순서로 깊은 색상으로 색칠하는 순서로 그래프를 색칠합니다). Max Clique를 계산하십시오. 이것은 최적의 착색에 사용되는 가장 큰 색상이 완벽한 그래프에서 최대 색상의 크기이므로 이는 완벽한 그래프 (및 간격 그래프가 완벽 함)입니다. 불행히도, 그 이상으로, 나는 최대의 매달리크를 계산하는 방법에 대해 분실 당한다. 명백한 접근 방식은 최대 색상이 증가 할 때마다 일부 데이터 구조를 수정하는 것입니다.하지만 사용하는 데이터 구조 또는 수정 방법을 정확하게 알아낼 수는 없습니다.

누구나이 알고리즘에 대한 참조를 알고 있거나 설명을 재발견 할 수 있습니까?

도움이 되었습니까?

해결책

간격 그래프는 코드가 좁은 그래프에서 선형 시간 알고리즘을 사용하여 최대 그래프에서 Max Delique를 찾을 수 있습니다.먼저 완벽한 제거 순서를 찾은 다음 정점이 제거 될 때마다 그 사실을 사용하여 아직 제거되지 않은 이웃들과 함께 사용할 수있는 사실을 사용하여 수행 할 수 있습니다.또한이 과정에서 모든 최대 파벌이 나타납니다.

완벽한 제거 순서를 찾으려면 최대 카디널리티 검색 (MCS)이 가장 간단한 알고리즘이며 선형 시간으로 작동합니다.(Wikipedia가 lexbfs를 먼저 언급하는지 모르겠습니다. 훨씬 더 복잡합니다.)

다른 팁

def mex(m):
  for i in [0 ..]:
    if not(m.contains(i)):
      return i

def maxCliqueOfIntervals(intervals):
  maxClique = []
  map = {}
  for interval in intervals.sort():
    // map should only contain intervals that overlap with the current interval
    map.filter(lambda x: overlaps(x, interval));
    // choose the smallest color not in the map to color the current interval
    map.insert(mex(map), interval);
    // the map now comprises a clique, if it is larger than the current max clique,
    // replace the max clique with the current map
    if map.size() > maxClique.size():
      maxClique = map.elems();
  return maxClique;
.

$ o (n \ log n) $ 시간에 실행되는 간격 착색 알고리즘을 기반으로 한 올바른 구현이라고 생각합니다.

MAX Clique를주의하면서, 조금만 간소화 할 수 있습니다 :

def maxCliqueOfIntervals(intervals):
  maxClique = []
  active = []
  for interval in intervals.sort():
    active.filter(\x -> overlaps(x, interval));
    active.push(interval);
    if active.size() > maxClique.size():
      maxClique = active;
  return maxClique;
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 cs.stackexchange
scroll top