2010-04-03 3 views
5

I는 에지 1{1:2}이다 에지 2{2:3}이다 에지 3{3,4}이고 숫자 값으로 나타내는 사이클이 많이 (예를 들어, 1-2-3-4 4 개 모서리와 사이클에 대응해야 가장자리 4{4,1} 등입니다.알고리즘 그룹의 모든 싸이클 함께

주기가 하나의 가장자리를 공유하는 경우 다른주기와 연결되는 것으로 알려져 있습니다.

예를 들어 두 사이클이 1-2-3-45-6-7-8 인 경우 두 사이클이 서로 연결되어 있지 않으므로 두 개의 사이클 그룹이 있다고 가정 해 보겠습니다. 1-2-3-43-4-5-6의 두주기가있는 경우이 두주기가 같은 가장자리를 공유하기 때문에 하나의주기 그룹 만 있습니다.

아래 그림은 나의 점을 설명 할 수 있어야한다 :

alt text http://lh5.ggpht.com/_SDci0Pf3tzU/SuBhd07xbWI/AAAAAAAAFMs/9OlMhN8uzzQ/s640/mst.jpg

R1, R2R7에 내가 "주기"라고 부릅니다 있습니다. 위 그림에서 R1부터 R7까지를 포함하는 하나의주기 그룹 만 있습니다.

모든 사이클 그룹을 찾는 가장 효율적인 방법은 무엇입니까?

+0

입력 방법은 무엇입니까? 당신의 예제 에서처럼 또는 그래프 나 그런 식으로 주어 졌습니까? – IVlad

+0

이 질문은 수학 오버 플로우에 더 적합 할 수 있습니다. –

+0

아마도 당신이 성취하고자하는 것을 설명해야합니다. 그 이유는 그것이 "주기"라고 부르는 이유와 그것이 "가장자리"를 갖는 이유에 대한 단서를 줄 수 있다는 것입니다. – Guffa

답변

3

First 그래프의 모든주기를 찾아 예를 들어 A, B, C 등으로 레이블을 붙이십시오. 이제 그래프에있는 각주기가 새 그래프의 단일 노드로 변환되는 새 그래프를 만드십시오. 연관된 그래프가 오래된 그래프에서 "연결"되어있는 경우, 새로운 그래프의 가장자리가있는 노드를 연결하십시오 (다소 특이한) 연결 정의를 사용하십시오.

"주기 그룹 수"는 새 그래프의 connected components입니다.

+0

@Thanks Mark,하지만 어쨌든 각 사이클 그룹 내의 모든 사이클을 되 찾을 수 있습니까? – Graviton

+0

@ 마크, 또한 질문은 사이클이 연결되어 있는지 확인하는 방법에 대해 묻는 것입니다.하지만 답변에 노드에 가입해야한다고 더 명확하게 말할 수 있습니까? – Graviton

+0

@Ngu : 감지 사이클을 다른 사람에게 맡깁니다. 두 사이클이 연결되어 있는지 확인하려면 공유하는 엣지 수를 계산하십시오. 일단주기를 발견하면 새로운 그래프 G '를 만들 수 있습니다. 당신의 예에서 G '는 당신이 발견 한 각주기마다 하나씩, 7 개의 노드를 포함 할 것입니다. 이 새로운 노드 R1, R2, ..., R7을 호출하십시오. 두 사이클이 연결되면 G '사이에 엣지를 만듭니다. R1은 R6과 R7의 가장자리를 가져야합니다. R2는 R3와 R7 등의 가장자리를 가져야합니다 ... 위키 피 디아의 표준 알고리즘을 사용하여 그래프의 연결된 구성 요소를 계산합니다. 대답은 1입니다. –

0

나는 이것이 가장 효율적인 방법 아니라는 것을 확신 해요,하지만 이건 내 최초의 시도가 될 것입니다 :

먼저 교환이 정점에 가장자리 : 그래서 예를주기 1-2-3-4, 3-4-5-65-6-7-8를 들어, 'LL 필요 :이 괜찮 (V의 * (V-1))/2 정점,하지만 당신을 포기

"12" => "A" 
"23" => "B" 
"34" => "C" 
"45" => "D" 
"56" => "E" 
"67" => "F" 
"78" => "G" 
"41" => "H" 
"63" => "I" 
"85" => "J" 

- 그것은 여전히 ​​O (V^2) 알고리즘 충분 될 수 있습니다.

그리고 비트 필드로주기를 나타냅니다 은 "1-2-3-4은"

ABCDEFGHIJ 
1110000100 

ABCH

와 "3-4-5-6"가 CDEI

가되도록
ABCDEFGHIJ 
0011100010 

그들은 정확히 하나의 비트를 공유합니다. 즉, 원래의 그래프에서 정확히 한 모서리가 공통점을 가졌음을 의미합니다. 이것은 O (v^2)로 비트 단위로 검사하거나 바이너리 탐색 (비트가 공통 인 비트가있는 경우 ANDing을 먼저 수행 한 다음 비트의 처음 절반을 ANDing으로 검사)을 통해 확인할 수 있습니다.

+0

솔루션이 작동한다고 생각하지 마십시오. 두 사이클이 직접 연결되지 않더라도 여전히 같은주기 그룹에 속해 있으면 어떨까요? – Graviton

+0

@Ngu : 제 의도는 두 사이클을 먼저 테스트하고, 연결되어있는 경우 결합 (결합은 OR 연산으로 쉽게 수행 할 수 있음)입니다. 그런 다음 다음주기를 계속하십시오. 여기에 사용 된 것처럼 그룹화가 올바르게 이해되기를 바랍니다. –

+0

성능을 향상 시키려면 AND 결합을 통해 한 번에 3 ~ 4 개의 사이클을 테스트 해 볼 수 있습니다 (그 가능성은 얼마나되는지, 하나의 그룹에 사이클이 있는지, 이렇게하면 성능을 조정할 수 있음). 일치가 발생하면 사이클의 쌍에만 "드릴 다운"하십시오. 사이클의 1/2을 ANDing으로 반복하여 "드릴링"할 수도 있습니다 ... –

관련 문제