1. Lặp qua các node trong graph, nếu nó đã được duyệt thì bỏ qua.
2. Nếu node chưa được duyệt thì men theo node cha và:
- Đánh dấu đã duyệt cho các node.
- Đánh thứ tự duyệt (th) cho các node.
- Đánh dấu node bắt đầu (nstart) cho các node.
3. Trong quá trình đi theo node cha nếu gặp được node đã duyệt (dnode) thì so sánh với node hiện tại (cnode) xem là node bắt đầu (nstart) có giống nhau không.
- Nếu giống thì lưu kết quả lại: res = th(dnode) - th(cnode) + 1
4. Trả về kết quả res lớn nhất.
Code:
func longestCycle(edges []int) int {
visitedAtCount := make([]int, len(edges))
visitedAtIndex := make([]int, len(edges))
res := -1
for i, _ := range edges {
if visitedAtCount[i] > 0 {
continue
}
count := 0
prev_i := i
_i := edges[i]
for _i != -1 && visitedAtCount[_i] == 0 {
count = count + 1
visitedAtCount[_i] = count
visitedAtIndex[_i] = i
prev_i = _i
_i = edges[_i]
}
if _i == -1 || visitedAtIndex[prev_i] != visitedAtIndex[_i] {
continue
}
cres := visitedAtCount[prev_i] - visitedAtCount[_i] + 1
if cres > 0 && cres > res {
res = cres
}
}
return res
}