Вопрос задан 04.09.2020 в 19:30. Предмет Информатика. Спрашивает Яковлев Сережа.

Помогите решить на С++ Есть n городов. Они соединяются с помощью m дорог. Дорога соединяет два

города между собой. Города A и B находятся в одной сети городов, если машина от сервера A может по рабочим дорогам доехать до города B, возможно проходя при этом через промежуточные города. Если город может соединиться только с собой, то считается, что он сам по себе представляет сеть городов. В строительной компании появились нарушители, которые начали ломать дороги. Пока ваш напарник поехал за правительством, вам поручили посчитать полученный ущерб компании. Вам нужно ответить, сколько всего сетей городов в компании возникало после выведения каждой дороги из строя. Формат входных данных В первой строке вводится целое число n (2≤n≤3⋅10^5) - количество городов в компании. Во второй строке вводится целое число m (1≤m≤3⋅10^5) - количество дорог. В следующих m строках вводятся пары различных чисел a,b (1≤a,b≤n) номера городов, которые соединяет i-ая дорога. В следующей строке вводится число q (1≤q≤m) количество сломанных дорог. В следующей строке вводится q различных чисел – номера сломанных дорог. Все номера различны и идут в хронологическом порядке. Формат выходных данных Выведите q чисел, количество различных сетей городов после выведения из строя следующего города. Примечание Первый пример: после удаления первой дороги все города все еще находятся в одной сети городов. После удаления второй дороги, сеть городов разбивается на две части: города 1,3 и город 2. Sample Input 1: 3 3 1 2 2 3 1 3 2 1 2 Sample Output 1: 1 2 Sample Input 2: 4 3 1 2 1 4 4 2 1 3 Sample Output 2: 2
0 0
Перейти к ответам

Ответы на вопрос

Внимание! Ответы на вопросы дают живые люди. Они могут содержать ошибочную информацию, заблуждения, а также ответы могут быть сгенерированы нейросетями. Будьте внимательны. Если вы уверены, что ответ неверный, нажмите кнопку "Пожаловаться" под ответом.
Отвечает нейросеть ChatGpt. Будьте внимательны, ответы нейросети могут содержать ошибочные или выдуманные данные.

Для решения этой задачи, давайте разберемся, как можно определить количество сетей городов после каждого удаления дороги.

Для начала создадим структуру данных для представления городов и дорог. Мы можем использовать структуры данных, такие как списки смежности или деревья.

Давайте создадим примерный план решения на языке C++:

```cpp #include #include #include

using namespace std;

// Функция для поиска корня дерева int findRoot(int city, vector& parent) { if (parent[city] == -1) return city; return findRoot(parent[city], parent); }

// Функция для объединения двух деревьев void unionTrees(int city1, int city2, vector& parent) { int root1 = findRoot(city1, parent); int root2 = findRoot(city2, parent); if (root1 != root2) parent[root1] = root2; }

int main() { int n, m; cin >> n >> m;

vector parent(n + 1, -1); // Используем 1-based индексацию

// Заполняем начальные связи между городами for (int i = 0; i < m; ++i) { int a, b; cin >> a >> b; unionTrees(a, b, parent); }

int q; cin >> q;

set uniqueSets;

// Перед удалением дорог сохраняем количество уникальных сетей uniqueSets.insert(parent.end(), parent.begin(), parent.end());

for (int i = 0; i < q; ++i) { int brokenRoad; cin >> brokenRoad;

// Удаляем дорогу int a = findRoot(brokenRoad, parent); parent[brokenRoad] = -1;

// Пересчитываем количество уникальных сетей uniqueSets.insert(parent.end(), parent.begin(), parent.end());

cout << uniqueSets.size() - 1 << endl; // Вычитаем 1, так как первый элемент -1 не является городом }

return 0; } ```

Этот код представляет собой простой способ решения задачи. Он использует структуру "родительский указатель" для отслеживания связей между городами и дорогами. После удаления каждой дороги мы пересчитываем количество уникальных сетей городов и выводим результат.

0 0

Топ вопросов за вчера в категории Информатика

Последние заданные вопросы в категории Информатика

Задать вопрос