경 방향 그래프,선형이 반환 노드를 위해서.그렇지 않으면 실패

cs.stackexchange https://cs.stackexchange.com/questions/125142

  •  29-09-2020
  •  | 
  •  

문제

문제

나는 설정의 edges (a, b), 디 ab 은 노드에,비순환 방향 그래프(DAG).

수의 가장자리를 보장할 수의 노드-1.

내가 찾는 알고리즘을 발견한 순서 노드 [n_1, ... n_n] 그래서 순서를 포함 모든 노드의 그래프에서,그리고 모든 가장자리 (n_i, n_i+1)0 < i < n 에 존재하는 edges.는 경우에는 순서가 가능하지 않기 때문에 주어진 세트의 edges 되지 않은 동일한 세트의 가장자리에 필요한 다음 필요해요 오류가 발생합니다.

편집:그래프에 있는 임의의 숫자를 연결이 끊어 구성 요소입니다.나는 분명히 고려하지 않는다 그래프로 연결되지 않은 여러 구성 요소으로 선형입니다.

아이디어 지금까지

참고하는 내가 있는지 확인하는의 수 edges 정확히 수의 가장자리에 필요한은 같은 시퀀스를 존재합니다.결과적으로는 알고리즘 실패할 수 있는 경우가 있는 두 개의 가장자리가 공유하는 원본 또는 목적지입니다.그러나,가 있습니다.

나는 깨닫는 위상 정렬 반환 선형 순서 방향 그래프,을 만족하는 나의 요구 사항입니다.그러나,여전히 실패하고 싶을 때는 그래프가 정확하지 않게 선형는 대신한 선형 순서입니다.

어쩌면 내가 유효성을 검증할 수 있습라면,위상 정렬합니다.그러나 그 소리를 비효율적이다.나 또한지 확인에 대한 형식의 이름을 것이 문제,그래서 그것의 하드 간단하게 찾는 알고리즘이 있습니다.나는 같은 느낌이 나는 없는 몇 가지 간단한 연결은 여기에 속임수.

할 수 있을 제공하는 알고리즘을 수행하는 이?나는 의사 또는 모든 언어의 선택입니다.

도움이 되었습니까?

해결책 2

제가 생각하는 알고리즘 적어도 통행 시험의 경우:

let N = set of all nodes
let E = set of all edges

if (|E| != |N|-1) fail

let possibleStartNodes = new set containing all of N
let nexts = new dictionary from node -> node

foreach (prev, next) in E:
  if (next not in possibleStartNodes) fail 
  remove next from possibleStartNodes
  nexts[prev] = next
end foreach

if (|possibleStartNodes| != 1) fail

let currentNode = the one node in possibleStartNodes
let ordering = new list
ordering.push(currentNode)

while (nexts contains value for currentNode) 
  ordering.push(next)
  currentNode = next
end while

return ordering

$O(n)$ 꽤 합리적이다.이 있을 개선하는 방법?

편집: 내가 주시면 감사하겠습니다에 대한 힌트를 올바른 기술적 측면에 대한 개념을 사용하고

다른 팁

여기에는 매우 비 최적 알고리즘을 얻을,당신은 시작합니다.

모든 가장자리 $(a,b)$.각 가장자리에 대해,다시 가서 모든 모서리,그리고 얼마나 많은 시간 체크인 $달 가 나타납니다.지면 당신은 발견 $달 는 한 번만 나타납(이 발생하지 않 거부하).리 $n_1=a$.

모든 가장자리를 다시 찾고,독특한 가장자리 $(n_1,b)$$n_1$ 가 나타납니다.가 $n_2=b$.

모든 가장자리를 다시 찾고,가장자리 $(n_2,c)$$n_2$ 왼쪽에 표시(이 없는 경우에는 가장자리,거부하).가 $n_3=c$.

에서 계속 이 방법을 찾기 $n_4,\ldots,n_n$.

이 알고리즘에서 실행됩 $O(n^2)$.를 사용하여 해시,당신이 할 수 있어야 그것을 개선하기 $O(n)$.

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