Почта спонсора C++

Все вы помните задачу "Слово спонсора" с новогодних соревнований. Напомню кратко проблему, стоявшую в этой задаче: после завершения соревнований спонсор пожелал разослать победителям призы.

Но почтовая система не совершенна и не всем участникам призы могли быть доставлены. Конкретнее, в стране есть n почтовых отделений, пронумерованных от 1 до n. Спонсор отправляет призы с отделения под номером s. Также нам известны пары отделений, имеющих связь между собой, то есть, между какими отделениями может передаваться почта.

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

Входные данные

   В первой строке заданы три числа - количество отделений n (1 ≤ n ≤ 100000), номер отделения, которым пользуется спонcор s (1 ≤ s ≤ n) и количество существующих связей между парами отделений k (0 ≤ k ≤ 100000).

В следующих k строках записано по 2 числа a и b - номера отделений, между которыми осуществляется перевозка почты (a и b - разные числа с интервала [1n]). Все пары (ab) разные.

Выходные данные

   Единственное число - наименее возможное количество новых связей, которые необходимо создать, чтобы почту можно было доставить с отделения s в любое другое отделение.

			#include "iostream"
#include "vector"

using namespace std;

vector < int > a[100000];
bool used[100000];

void dfs(int b)
{
    used[b] = 1;
    for (int i = 0; i < a[b].size(); ++i)
    {
        int to = a[b][i];
        if (!used[to]) dfs(to);
    }
}

int main()
{
    int res = 0, n, s, k, x, y;
    cin >> n >> s >> k;
    for (int i = 0; i < k; ++i)
    {
        cin >> x >> y;
        x--; y--;
        a[x].push_back(y);
        a[y].push_back(x);
    }
    for (int i = 0; i < n; ++i)
    {
        if (used[i] == 0)
        {
            dfs(i);
            res++;
        }
    }
    cout << res - 1 << endl;
    return 0;
}
Назад

Повышение продаж с помощью веб-форм Разложение числа на простые множители Как качественный контент способствует продвижению сайта Как выбрать хостинг Как писать SEO-тексты? Что такое SEO оптимизация сайта


Хостинг

Есть решение которого нет на сайте? Пиши admin@devexe.top