Задача на систему непересекающихся множеств
https://t.me/golangtestsКонтекст: Если данные раскиданы по непересекающимся множествам, то они решаются одним и тем же способом.
Сложность: Средняя
Условие задачи: даётся n провинций, какие-то из них соединены между собой, какие-то нет, также соблюдается правило транзитивности: если провинция «1» соединена с провинцией «2», а «2» соединена с «3» провинцией, то и «1» соединена с «3».
Провинцией является совокупность городов, объединённых между собой, но при этом отделенные от других, принадлежащих другим провинциям.
На вход даётся квадратичная матрица, в которой isConnected[i][j] = 1 - соединение между i - ым и j - - ым населенными пунктами (1 - имеется соединение, 0 - отсутствует).
Необходимо вычислить количество провинций.
Пример:

Ввод: isConnected = [[1,1,0],[1,1,0],[0,0,1]]
Вывод: 2
Объяснение: *во вложении
Решается задача поиском в глубину.
func findCircleNum(isConnected [][]int) int {
var res int
graph := make(map[int][]int)
for i := range isConnected {
for j := range isConnected[i] {
if isConnected[i][j] == 1 && i != j {
graph[i] = append(graph[i], j)
}
}
}
visited := make(map[int]struct{})
for i := range isConnected {
if _, ok := visited[i]; ok {
continue
}
res++
q := list.New()
visited[i] = struct{}{}
q.PushBack(i)
for q.Len() != 0 {
elem := q.Front()
curr := elem.Value.(int)
q.Remove(elem)
for _, c := range graph[curr] {
if _, ok := visited[c]; ok {
continue
}
visited[c] = struct{}{}
q.PushBack(c)
}
}
}
return res
}