Перевезення корів (Бронза)#11185

Перевезення корів (Бронза) (Розбір)

Кожен маршрут задає напрямлену послідовність міст. Оскільки Бессі хоче скористатися лише одним маршрутом, для кожного маршруту достатньо перевірити:

чи зустрічається місто раніше за місто ?

Якщо ця умова виконується, Бессі може скористатися даним маршрутом і заплатити його фіксовану вартість. Серед усіх підходящих маршрутів необхідно знайти маршрут з мінімальною вартістю.

Приклад

У прикладі є маршрути:

Оскільки A = 1, а B = 2, Бессі може скористатися лише третім маршрутом: місто зустрічається в ньому раніше за місто . Вартість цього маршруту дорівнює .

Реалізація алгоритму

Оголосимо константу .

#define INF 1000000000

Читаємо вхідні дані.

scanf("%d %d %d", &a, &b, &n);

Ініціалізуємо змінну , в якій будемо зберігати відповідь.

res = INF;

Перебираємо маршрутів.

for (i = 0; i < n; i++)
{

Читаємо вартість маршруту та кількість міст на цьому маршруті.

  scanf("%d %d", &cost, &sz);

Змінна містить , якщо місто ще не зустрілося на поточному маршруті.

  flag = false;

Послідовно читаємо міста поточного маршруту.

  for (j = 0; j < sz; j++)
  {
    scanf("%d", &city);

Якщо зустрілося місто , встановлюємо flag = true.

    if (city == a) flag = true;

Якщо зустрілося місто , і до цього на маршруті вже зустрілося місто А~(flag = true), то Бессі може скористатися цим маршрутом, заплативши його вартість .

Якщо підходящих маршрутів декілька, обираємо маршрут з мінімальною вартістю.

    if (flag && city == b) res = min(res, cost);
  }
}

Після обробки всіх маршрутів виводимо відповідь.

if (res == INF)
  printf("-1\n");
else
  printf("%d\n", res);