Задача на систему непересекающихся множеств

Задача на систему непересекающихся множеств

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
}


Report Page