Я наткнулся на проблему с последней Кубка Facebook Hacker Cup (так что это НЕ моя домашняя работа, я просто нахожу ее очень интересной), и я также подумал о любопытном, но довольно хорошем решении.Не могли бы вы проверить мою мысль?Вот задача:
Вам предоставлена сеть из N городов и М двунаправленных дорог, соединяющих эти города.Первые K городов важны.Необходимо удалить минимальное количество дорог, чтобы в оставшейся сети не было циклов, содержащих важные города.Цикл - это последовательность, по крайней мере, трех разных городов, так что каждая пара соседних городов соединена дорогой, а первый и последний города в последовательности также соединены дорогой.
Ввод
В первой строке содержится количество тестовых случаев T.
Каждый случай начинается со строки, содержащей целые числа N, M и K, которые представляют количество городов, количество дорог иколичество важных городов соответственно.Города пронумерованы от 0 до N-1, а важные города пронумерованы от 0 до K-1.Следующие M строк содержат два целых числа a [i] и b [i], 0 ≤ i
Гарантируется, что 0 ≤ a [i],b [i]
Вывод
Для каждого из тестовых случаев, пронумерованных в порядке от 1 до T, выведите «Case #i:», а затемодно целое число, минимальное количество дорог, которые необходимо удалить, чтобы не было циклов, содержащих важный город.
Ограничения
1 ≤ T ≤ 20
1 ≤ N ≤ 10000
1 ≤ M ≤ 50000
1 ≤ K ≤ N
Пример
В первом примере мы имеем N = 5 городов, которыесоединены М = 7 дорогами и города 0 и 1 важны.Мы можем удалить две дороги, соединяющие (0, 1) и (1, 2), и оставшаяся сеть не будет содержать циклы с важными городами.Обратите внимание, что в оставшейся сети есть цикл, который содержит только не важные города, и что есть также несколько способов удалить две дороги и удовлетворить все условия.Нельзя удалить только одну дорогу и уничтожить все циклы, которые содержат важные города.
Пример ввода
1
5 7 2
0 1
1 2
1 4
0 2
2 4
2 3
3 4
Поэтому я подумал об этом так: при построении графика давайтемассив, хранящий информацию о том, сколько соседей имеет каждый город (== сколько дорог там связано с данным городом).В этом примере у города 0 2, у города 1 3 и т. Д.Давайте назовем эти числа «значением города» определенного города.
После получения всего ввода мы проходим весь массив значений городов в поисках городов со значением 1. При переходе к одному это означает, чтоне может быть в цикле, поэтому мы уменьшаем его значение, «удаляем» (без потери общности) дорогу, соединяющую его со своим единственным соседом, и уменьшаем значение соседа.После этого мы рекурсивно идем к соседу, проверяя ту же вещь, если значение там 1 - повторяем схему и рекурсивно идем глубже.Если нет - не трогай.
После этой оперыКроме того, мы очистили все части графика, которые не являются циклами и не могут быть их частью. Мы также избавились от всех дорог, которые не имели смысла. Так что на этот раз мы называем другую функцию - работаем только в важных городах. Итак, мы берем вершину 1 - после использования функции, описанной в предыдущем абзаце, ее значение не может быть 1 (так как она уже была бы сделана нулем функцией), поэтому либо 0, либо что-то> 1. В первом случае нам не нужно ничего делать. В последнем случае мы должны сделать значение 1, которое выполняется удалением значения-1. Как и в предыдущем абзаце, после каждого удаления мы уменьшаем значение как этого города, так и его соседа, также удаляя дорогу. Мы повторяем это для всех k важных городов, суммируя значения 1 из всех важных городов, и это наш ответ.
Есть ли смысл? Для всех тестов, которые я пробовал, это работало, и я хотел бы верить, что это правильно, но я почему-то чувствую, что где-то может быть утечка. Не могли бы вы проверить это? Это хорошо? Если нет, то почему в этом мыслительном процессе что-то правильно? :)