2
내가 작성한 다음 C# 알고리즘은 O (n) 시간에 무향 그래프의주기 존재를 감지합니다. 그것은 재귀를 피하고 사전과 HashSet을 통한 해시를 이용합니다. 그러나 내가 더 잘할 수있는 방법이 있습니까?이것은 방향이없는 그래프의주기를 감지하는 가장 좋은 알고리즘입니까?
void Main()
{
var graph = new Dictionary<int, HashSet<int>>
{
{ 0, new HashSet<int> { 4 } },
{ 1, new HashSet<int> { 2, 3, 4 } },
{ 2, new HashSet<int> { 1 } },
{ 3, new HashSet<int> { 1, 4 } },
{ 4, new HashSet<int> { 0, 1, 3 } }
};
Console.WriteLine(HasCycle(graph, 0));
}
bool HasCycle(Dictionary<int, HashSet<int>> graph, int start)
{
var stack = new Stack<int>();
var visited = new HashSet<int>();
stack.Push(start);
var curr = start;
var prev = -1;
while (stack.Count > 0)
{
prev = curr;
curr = stack.Pop();
visited.Add(curr);
HashSet<int> neighbors;
if (graph.TryGetValue(curr, out neighbors) && neighbors != null)
{
foreach (var neighbor in neighbors)
{
if (!visited.Contains(neighbor))
{
stack.Push(neighbor);
}
else if (neighbor != prev && neighbors.Contains(prev))
{
return true;
}
}
}
}
return false;
}
이미 방문한 노드에서 반복되는 경우주기가 발생합니다. – arboreal84
그러나 * 무향 * 그래프의 경우, 이미 방문한 노드가 방금 나온 노드가 아닌지 확인해야합니다. 그것은 'else'문에서 캡처하려고하는 논리입니다. –