2016-09-11 2 views
4

등가 정점은 '유입'및 '발신'정점이 동일한 정점입니다.그래프에서 모든 등가 정점을 찾는 방법은 무엇입니까?

in this case **a** and **c**

누군가는 어떻게 알고리즘에 접근하는 방법 좀 도와 줄래? 그런

내가 생각 뭔가 :은 같은 시간에 두 개의 정점을 검색하고 내가 동등의 수출입 및 정점을 찾을 경우 등등 ..을 인쇄하고, 그래서 실제 bruteforce 수 있지만 방법 예를 들어 재귀를 사용하여 이렇게하려면? 최상의 솔루션은 무엇입니까?

답변

1

다음은 재귀적인 해결책입니다.

2 개를 제외한 모든 정점을 제거한다고 상상해보십시오 (두 개는 상관 없습니다). 당신의 예에서

, 우리는을위한 B을 제외한 모든 정점을 제거한다고 가정합니다. 에서 B에 에지가 존재하고, B 에서에 에지가있는 경우만 및 B 는 동일하다는 것을 주목하라. 이것은 기본 사례입니다.

누락 된 정점을 하나씩 추가한다고 가정합니다 (순서는 중요하지 않음). 우리가 고려해야 할 두 가지 경우가 있습니다. i) 정점을 추가 할 때 정점 집합이 등가가되는지 확인해야합니다. ii) 동등한 버텍스 세트가 여전히 동등한 지 확인해야합니다. 당신의 예에서

사례 1.

, 우리는 C, (우리는 정점 B 시작했다 리콜)을 추가한다고 가정합니다. b은 (는) 해당하지 않습니다. 왜?, 는 B누락되어 나가는 정점을 갖고, C 그래프 이전에 없었기 때문에 해당 발신 정점, C아니므. 따라서 c에 해당하는 정점이 있는지 확인해야합니다. c의 나가는 정점의 꼭지점을 확인하고 c 인 정점의 나가는 꼭지점을 확인하여 효율적으로 수행 할 수 있습니다. 그런 다음 과 c이 동일한 것을 알 수 있습니다.

참고 : 나는 게시물의 나머지 부분에서 정점의 equility을 표시하기 위해 = 기호를 사용.

우리가 새로운 정점을 추가 할 때마다 그래프에, 우리는 정점의 쌍가 존재하지 않는다는 사실을 알고 (의이 Z 말을하자),보다 일반적인하기 위해, (의이 X을 가정 해 봅시다 Y)되도록 X! = 우리 Z를 추가 한 후 우리 Z, X 및 Y = 추가하기 전에 Y.

X
Y 즉, 일반성의 손실없이이없는 w 나가는 또는 들어오는 정점 을 보유한다고 가정하기 때문이다. 우리는 w! = z을 추가하지 않았으므로 z을 아직 모르고 있습니다. 그런 다음 z을 추가 한 후에도 y은 여전히 ​​정점 w이 누락됩니다. 따라서 z을 추가 한 후에 x! = y을 추가합니다. 따라서 z에 해당하는 정점이 있는지 확인해야합니다. 2

이 경우

사례는 훨씬 간단합니다. 귀하의 예제에서, 우리는 마침내 D, (우리가, BC 이전 정점 를 추가 리콜)를 추가한다고 가정합니다. c은 동등한 것으로 계산되었고 을 추가 한 후에도 동일한 지 확인해야합니다. 우리가해야 할 일은 모두 cd이 나가는 지 또는 정점 인지를 확인하는 것입니다. 그리고 그들을 비교하십시오.


결론적으로 두 임의의 정점으로 시작하여 두 정점이 같은지 확인합니다. 그 후, 각 정점을 하나씩 더하고 위에서 설명한대로 case 1case 2을 확인합니다.

그래서 재귀 함수 EQ (n)이 모든 동등한 정점을 반환한다고 가정 해 보겠습니다. 그런 다음 n 개의 꼭지점이있는 EQ (n-1)이라고 표시된 그래프가 제공됩니다 (즉, z라고 가정 해 봅시다). 사례 1사례 2을 확인하면 z이 전체 솔루션에 미치는 영향을 확인할 수 있습니다. 그리고 기본 케이스에서는 처음에 언급했듯이 n = 2입니다.

는 따라서 알고리즘의 실행 시간이 재발 T (2)와 같이 주어지는, = O (1)및 T (n)은 T = (N - 1) + O (N). 따라서 실행 시간은 O (n^2)입니다.

1

하나의 접근법은 정점 주입을위한 하나의 정점, List ingoingVertices 및 나가는 정점들 중 하나 인 List outgoingVertices에 대한 목록을 각 정점에 추가하는 것입니다. 그런 다음 방문한 정점을 첫 번째 정점 내의 List outgoingVertices에 추가하는 각 정점의 가장자리를 통과하고 첫 번째 정점에서 가장자리를 가져갈 때마다 첫 번째 정점을 방문 된 정점의 List ingoingEdges에 추가하십시오. 그런 다음 두 꼭지점간에 목록이 동일하면 동등한 점을 찾기 위해 꼭지점을 반복합니다.

각 정점을 재귀 적으로 방문한 다음 해당 정점을 수행하는 것은 각 정점을 반복하는 것과 거의 같습니다. 한 번에 두 개의 꼭지점 만 비교하는 무차별 강제 실행은 가능하지만 코드를 작성하는 데는 많은 노력이 필요하며 런타임 중에는 더 많은 시간이 소요됩니다.

+0

나는 발신 및 입교 학위 만 확인합니다. 그러나 OP는 동등한 것은 동일한 ingoing과 나가는 VERTEX를 가지고 있다고 말합니다. – errorist

+0

@errorist, 나는 잘못 읽고, 나는 나의 직위를 교정 할 것이다. –

관련 문제