26X26 행렬을 정점의 직접 그래프를 각 알파벳으로, 단어를 가장자리로 나타내도록 만듭니다. 예를 들어-APPLE은 정점 A와 E를 A에서 E로 향한 모서리와 연결합니다. 이제 문제는 그래프에서 가장 큰 유 레리 안 트레일 (최대 모서리 수를 포함하는 경로, 정점 반복이 가능한 경우 각 모서리를 방문하는 경로)을 찾는 것으로 줄어 듭니다. O (E) 알고리즘 중 하나는 한 쌍의 꼭짓점에서 무작위로 시작하는 것입니다. 그들 사이의 길을 찾으십시오. 가능할 때까지 경로를 편안하게 유지하십시오.
@ GlenH7 업데이트 최근에 www.hackerearth / jda에서 비슷한 질문을 해결했습니다. 최상의 솔루션과 관련하여 상대적인 점수가 있었고 다음과 같은 접근법으로 가장 높은 점수를 얻었습니다.
주어진 단어 목록. 그들에 의해 형성 될 수있는 가장 긴 체인을 찾으십시오. 모든 단어가 마지막 단어의 끝에서 * 끝으로 시작하는 경우 체인은 유효합니다.
접근 =
1) 알파벳의 그래프를 꼭짓점으로 만들고 단어를 가장자리로 만듭니다. 여러 모서리를 사용하는 대신 모서리 수와 동일한 무게를 가진 모서리를 사용하십시오.
2) 최대 모서리로 그래프의 강하게 연결된 구성 요소를 찾습니다. 다른 가장자리는 일시적으로 버립니다.
3) 각 꼭짓점에 대해 그 정도가 바깥 쪽과 같아야합니다.
4) 이제 그래프에 유러 회로가 존재합니다. 그것을 찾아라.
5) 이제 남아있는 그래프에서 (wrt orignal graph는 선택된 강하게 연결된 구성 요소에서 첫 번째 꼭지점이있는 가장 긴 흔적을 찾습니다. 이것은 NP가 어렵다고 생각합니다.
6) Eulerian 회로를 트레일로 변환하는 Elerian 회로에 위의 트레일을 포함시킵니다.
이유-나는이 질문이 아마도 NP 하드 (수학적으로 말하는 것이 아니라 추측)라는 것을 받아들입니다. 그러나 위의 접근법은 균일하게 분포 된 단어의 긴 목록 (1000 +)이있을 때 가장 효과적입니다 (즉, 위의 접근법에 대한 화장실이 아닙니다). 주어진 목록을 위에서 언급 한 그래프로 변환 한 후 운 좋게 유러 리아 그래프로 밝혀졌습니다 ( http://en.wikipedia.org/wiki/Eulerian_path 참조 ) 의심의 여지없이 우리는 그 대답을 말할 수 있습니다 위의 질문은 P이며 실제로 그래프의 유러 경로입니다 ( http://www.graph-magics.com/articles/euler.php 참조 매우 간단한 접근 방식은 그래프가 있는지 확인하십시오. 단일 http://www.geeksforgeeks.org/strongly-connected-components/단일 scc에 대한 오일러 경로가 존재하기 때문에 다른 작은 scc를 일시적으로 청소하지 않는 경우). 따라서 운이 좋지 않은 경우 (거의 모든 경우에 해당) 나는 운이 좋은 경우로 변환하려고합니다 (즉, 오일러 트레일 조건이 충족됩니다). 이것을하는 방법? 관련이없는 가장자리 (정도보다 외도가 높은 정점에서 쳐다보고 경로가 아닌 정도의 정점에서 끝나는 경로의 가장자리 집합)에 대한 깊이 검색을 시도했습니다. 깊이 검색을 늘리면 먼저 경로의 두 가장자리보다 경로에서 하나의 가장자리 집합을 모두 검색했음을 의미합니다. 처음에는 i 번째 깊이 검색에 O (nodes ^ i)가 걸리기 때문에 운이 좋은 경우가 될 때까지 O (nodes + nodes ^ 2 + nodes ^ 3 + ....)의 총 시간 복잡성이있을 수 있습니다. 그러나 할부 상환 분석은 O (에지)라고 생각합니다. 운이 좋은 경우 감소하면 유러 회로를 찾으십시오.
여기까지 다항식 시간이었다. 이것은 거의 최고의 솔루션을 제공합니다. 그러나 솔루션을 더 높이려면 (완벽한 솔루션은 NP가 어렵습니다.) 남은 그래프에서 욕심 많은 접근 방식을 사용하여 선택한 scc의 정점 중 하나를 쳐다 보는 긴 흔적을 찾으십시오. 이제 이것을 발견 한 유레일 트레일에 추가하여 추가로 늘리십시오.