Все вы помните задачу "Слово спонсора" с новогодних соревнований. Напомню кратко проблему, стоявшую в этой задаче: после завершения соревнований спонсор пожелал разослать победителям призы.
Но почтовая система не совершенна и не всем участникам призы могли быть доставлены. Конкретнее, в стране есть n почтовых отделений, пронумерованных от 1 до n. Спонсор отправляет призы с отделения под номером s. Также нам известны пары отделений, имеющих связь между собой, то есть, между какими отделениями может передаваться почта.
Перед новыми соревнованиями спонсор решил наперед перестраховаться и гарантировать возможность доставки призов. Для этого спонсор готов за свои средства установить несколько новых связей между некоторыми парами почтовых отделений. Ваша задача - посчитать, какое наименьшее количество новых связей должен создать спонсор, чтобы призы можно было доставить после соревнований всем участникам, не смотря на то, где они проживают и каким почтовым отделением пользуются.
В первой строке заданы три числа - количество отделений n (1 ≤ n ≤ 100000), номер отделения, которым пользуется спонcор s (1 ≤ s ≤ n) и количество существующих связей между парами отделений k (0 ≤ k ≤ 100000).
В следующих k строках записано по 2 числа a и b - номера отделений, между которыми осуществляется перевозка почты (a и b - разные числа с интервала [1; n]). Все пары (a, b) разные.
Единственное число - наименее возможное количество новых связей, которые необходимо создать, чтобы почту можно было доставить с отделения 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;
}
Назад
Есть решение которого нет на сайте? Пиши admin@devexe.top