Кожен маршрут задає напрямлену послідовність міст. Оскільки Бессі хоче скористатися лише одним маршрутом, для кожного маршруту достатньо перевірити:
чи зустрічається місто раніше за місто ?
Якщо ця умова виконується, Бессі може скористатися даним маршрутом і заплатити його фіксовану вартість. Серед усіх підходящих маршрутів необхідно знайти маршрут з мінімальною вартістю.
Приклад
У прикладі є маршрути:
3 \to 2 \to 1;
2 \to 1 \to 4 \to 3;
4 \to 1 \to 7 \to 8 \to 2;
Оскільки 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);