К списку задач
Сложно Решено: 0 Процент решений: 0%

Minimum Network Connection Cost

Choose undirected links so that every vertex can reach every other vertex, with minimum total cost.

Чему вы научитесь

  • Дёшево связывать граф алгоритмом Краскала
  • Находить циклы через систему непересекающихся множеств
  • Сообщать, когда граф нельзя связать

Условие

Choose undirected links so that every vertex can reach every other vertex, with minimum total cost. A link can be used in either direction. Return −1 if the available links cannot connect the whole network. You do not need to return the selected links.

Implement minimum_network_connection_cost(vertices, links).

Input

vertices: The number of network vertices.

links: Available links [u, v, cost].

Output

Return the minimum total cost, −1 if impossible, or 0 for a one-vertex network.

Ограничения

1 ≤ vertices ≤ 100,000. 0…200,000 links; endpoints are distinct vertices in 1…vertices. Costs are 1…1,000,000,000. Parallel links are allowed. The total fits signed 64-bit.

Примеры

Пример 1
Ввод:
links = [
    [1, 2, 4],
    [2, 3, 2],
    [1, 3, 7]
]
vertices = 3

Ожидаемый вывод:
expected = 6
Ввод:
std::vector<std::vector<long long>> links = {
    {1, 2, 4},
    {2, 3, 2},
    {1, 3, 7}
};
long long vertices = 3;

Ожидаемый вывод:
long long expected = 6;
Ввод:
long[][] links = new long[][] {
    new long[] {1, 2, 4},
    new long[] {2, 3, 2},
    new long[] {1, 3, 7}
};
long vertices = 3;

Ожидаемый вывод:
long expected = 6;

Пояснение

Choose links costing 4 and 2 to connect all three vertices. Their total is 6; the cost-7 link is unnecessary.

Пример 2
Ввод:
links = [
    [1, 2, 4]
]
vertices = 3

Ожидаемый вывод:
expected = -1
Ввод:
std::vector<std::vector<long long>> links = {
    {1, 2, 4}
};
long long vertices = 3;

Ожидаемый вывод:
long long expected = -1;
Ввод:
long[][] links = new long[][] {
    new long[] {1, 2, 4}
};
long vertices = 3;

Ожидаемый вывод:
long expected = -1;

Пояснение

Vertex 3 has no connection. No selection can connect the entire network.

Как подступиться

Сначала попробуйте сами, затем открывайте подсказки по одной.

Подсказка 1

Нужен самый дешёвый набор связей, который всё ещё соединяет все вершины, так что подходит spanning tree.

Подсказка 2

Жадно добавляй самую дешёвую связь, которая не создаёт cycle, или растягивай компоненты через union-find.

Подсказка 3

Если usable links меньше, чем vertices minus one, соединяющих graph, ответ невозможен.

Ожидаемая сложность

время O(links log links), доп. память O(vertices + links)

Ссылки

Это задание адаптировано для CodeUtility. Следуйте условию и ограничениям выше.

Учитесь у других

Решения сообщества

Пока нет опубликованных решений. Решите задание, чтобы поделиться первым.