Hər marşrut şəhərlərin istiqamətləndirilmiş ardıcıllığını təyin edir. Bessi yalnız bir marşrutdan istifadə etmək istədiyi üçün, hər marşrut üçün yalnız aşağıdakını yoxlamaq kifayətdir:
şəhəri şəhərindən əvvəl rast gəlinirmi?
Əgər bu şərt yerinə yetirilirsə, Bessi həmin marşrutdan istifadə edə bilər və onun sabit dəyərini ödəyə bilər. Bütün uyğun marşrutlar arasında minimal dəyərə malik marşrutu tapmaq lazımdır.
Misal
Misalda marşrut var:
3 \to 2 \to 1;
2 \to 1 \to 4 \to 3;
4 \to 1 \to 7 \to 8 \to 2;
A = 1 və B = 2 olduğundan, Bessi yalnız üçüncü marşrutdan istifadə edə bilər: bu marşrutda şəhəri şəhərindən əvvəl rast gəlinir. Bu marşrutun dəyəri -ə bərabərdir.
Alqoritmin realizasiyası
sabitini elan edirik.
#define INF 1000000000Giriş məlumatlarını oxuyuruq.
scanf("%d %d %d", &a, &b, &n);Cavabı saxlayacağımız dəyişənini işə salırıq.
res = INF;marşrutu araşdırırıq.
for (i = 0; i < n; i++)
{Marşrutun dəyəri və bu marşrutdakı şəhərlərin sayı -i oxuyuruq.
scanf("%d %d", &cost, &sz);dəyişəni, əgər şəhəri hazırkı marşrutda hələ rast gəlinməyibsə, dəyərini saxlayır.
flag = false;Hazırkı marşrutdakı şəhərləri ardıcıl olaraq oxuyuruq.
for (j = 0; j < sz; j++)
{
scanf("%d", &city);Əgər şəhəri rast gəlinərsə, flag = true təyin edirik.
if (city == a) flag = true;Əgər şəhəri rast gəlinərsə və bundan əvvəl marşrutda artıq şəhəri rast gəlinibsə (flag = true), onda Bessi bu marşrutdan istifadə edə bilər, onun dəyərini ödəyərək.
Əgər uyğun marşrutlar bir neçədirsə, minimal dəyərə malik marşrutu seçirik.
if (flag && city == b) res = min(res, cost);
}
}Bütün marşrutlar emal edildikdən sonra cavabı çıxarırıq.
if (res == INF)
printf("-1\n");
else
printf("%d\n", res);