• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Pomoc z zadaniem z grafami

Object Storage Arubacloud
0 głosów
116 wizyt
pytanie zadane 11 września 2020 w Algorytmy przez wojtek_suchy Mądrala (6,880 p.)

Mam takie zadanie:

Autobus

Limit pamięci: 32 MB

W związku z nadchodzącymi wyborami, władze Bajtogrodu postanowiły uruchomić nową linię autobusową.

W Bajtogrodzie jest image skrzyżowań oraz image jednokierunkowych ulic łączących te skrzyżowania. Każda ulica ma kształt odcinka łączącego dwa skrzyżowania (nie ma na niej żadnych łuków, skrętów itd.). Skrzyżowania to jedyne miejsca, gdzie można zjechać z ulicy na inną - jeśli dwie ulice się krzyżują, a nie ma tam skrzyżowania, to prawdopodobnie jedna prowadzi tunelem albo wiaduktem; jeśli natomiast dwie ulice się pokrywają, to prawdopodobnie jedna prowadzi estakadą. Dwa skrzyżowania mogą być połączone przez wiele dróg - takie drogi uważane są wówczas za różne.

Prace posuwały się na początku szybko - bez problemu ustalono, jaki jest czas przejazdu autobusu przez każdą ulicę (okazało się, że wartość ta wyrażała się dla każdej ulicy parzystą liczbą minut), na których ulicach trzeba ustawić przystanki (przystanek zawsze stoi dokładnie w połowie ulicy, czyli od początku ulicy do przystanku autobus jedzie tak samo długo, jak od przystanku do końca ulicy) oraz w jakiej kolejności autobus ma je odwiedzać.

Dalej jednak zaczęły się schody.

Po pierwsze, okazało się, że autobus jest mało zwrotny, i może na skrzyżowaniach wykonywać skręty tylko wtedy, kiedy kąt skrętu jest nie większy niż image.

image
Jeżeli autobus jedzie w kierunku zgodnym ze strzałką, to image oznacza jego kąt skrętu.

Po drugie, nikt w Bajtogrodzkim Urzędzie Miasta nie potrafi znaleźć optymalnej trasy dla autobusu, minimalizującej czas przejazdu autobusu z pierwszego do ostatniego przystanku. Twój przyjaciel, który pracuje w Urzędzie, poprosił Cię o pomoc. Pomóż mu ułożyć optymalną trasę! Możemy przyjąć, że autobus w ogóle się nie zatrzymuje na przystankach (z dodaniem czasu na postój urzędnicy już sobie poradzą), lecz wystarczy, jeżeli przejedzie koło każdego z nich.

Zadanie

Napisz program, który:

  • wczyta ze standardowego wejścia opis Bajtogrodu oraz zamierzonych przystanków,
  • wyznaczy optymalną trasę autobusu,
  • wypisze wynik na standardowe wyjście.

 

Wejście

Pierwszy wiersz wejścia zawiera trzy liczby całkowite image, image i image (image, image, image), pooddzielane pojedynczymi odstępami - liczbę skrzyżowań w Bajtogrodzie, liczbę ulic i liczbę zamierzonych przystanków.

Kolejne image wierszy opisuje skrzyżowania. W image-szym wierszu wejścia znajdują się dwie liczby całkowite image i image (image), oddzielone pojedynczym odstępem - współrzędne image-tego skrzyżowania. Skrzyżowania są ponumerowane od image do image.

Następne image wierszy zawiera informacje o kolejnych ulicach. W image-szym wierszu znajdują się trzy liczby całkowite - image, image oraz image (image, image, image), pooddzielane pojedynczymi odstępami. Oznaczają one, że image-ta ulica prowadzi ze skrzyżowania image do image i czas przejazdu po tej ulicy wynosi image. Ulice są ponumerowane od image do image.

W kolejnych image wierszach znajduje się po jednej liczbie całkowitej; w wierszu image-szym znajduje się image (image) - numer ulicy, przy której ma się znaleźć image-ty przystanek. Numery ulic mogą się powtarzać - jeśli image, to oznacza, że po odwiedzeniu przystanków na ulicach image autobus ma wrócić na przystanek przy ulicy image. W szczególności, jeżeli image, to autobus powinien odjechać z przystanku image, a następnie wrócić do niego.

Wyjście

Jeśli nie istnieje trasa spełniająca wymogi Urzędu, to należy wypisać tylko jedno słowo NIE. W przeciwnym przypadku należy wypisać image wierszy. W image-tym wierszu powinien się znaleźć czas przyjazdu autobusu na image-szy przystanek (licząc od odjazdu z przystanku pierwszego), przy założeniu, że autobus jedzie optymalną trasą.

Przykład

Dla danych wejściowych:

4 6 3
-1 -1
1 -1
1 1
-1 1
1 2 1
2 3 2
3 4 3
4 1 5
2 4 1
1 3 2
1
4
3

poprawną odpowiedzią jest:

16
30

image

Na rysunku kółkami oznaczono skrzyżowania, a kwadratami - przystanki. Cienkimi kreskami oznaczono ulice, natomiast grubą - najlepszą możliwą trasę z pierwszego przystanku na drugi, czyli pierwszy fragment optymalnej trasy autobusu. Dla uproszczenia na rysunku pominięto czasy przejazdu przez poszczególne ulice.

 

Nie wiem za bardzo  jak się za to zabrać pomoże ktoś?

1 odpowiedź

0 głosów
odpowiedź 12 września 2020 przez Whistleroosh Maniak (56,980 p.)
W tym zadaniu trzeba znaleźć najkrótszą ścieżkę między przystankami e_1, e_2, ..., e_p. Możemy więc każdą parę sąsiednich przystanków rozważyć osobno tj. osobno policzyć najkrótszą sciężkę między e_i oraz e_{i+1}, a następnie to zsumować. Pojawia się tylko taki problem, że przystanki znajdują się na środku drogi, a dodatkowo nie możemy wykonać skrętu o kącie większym niż 90 stopni, czyli graf który został podany na wejściu jest bezużyteczny. Nikt jednak nie zabrania nam stworzyć nowego grafu.

Stwórzmy więc nowy graf, w którym wierzchołki odpowiadają środkom dróg, a także istnieje krawędź a->b, jeżeli da się dojechać ze środka drogi o numerze a, do środka drogi o numerze b, wykonując dokładnie jeden skręt o kącie nie większym niż 90. Dodatkowo każdej krawędzi przypiszemy wartość, która odpowiada czasowi, który jest potrzebny na przejechanie ze środka drogi a do środka drogi b. Taki graf można stworzyć przechodząc po wszystkich drogach, a nastepnie przechodząc po drogach z nią sąsiadujących, sprawdzając, czy kąt między tymi drogami jest mniejszy niż 90. Aby znaleźć kąt między dwoma drogami można wykorzystać właściwości iloczynu skalarnego.

Gdy taki graf mamy już zbudowany można np. obliczyć najkrótszą scieżkę między każdą parą wierzchołków, za pomocą algorytmu Floyda Warshalla. Wtedy możemy w czasie stałym znaleźć odległość z e_i do e_{i+1}.

Podobne pytania

0 głosów
2 odpowiedzi 399 wizyt
0 głosów
1 odpowiedź 91 wizyt
pytanie zadane 28 stycznia 2022 w C i C++ przez Mikusia^-^22 Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 528 wizyt
pytanie zadane 26 kwietnia 2019 w C i C++ przez Fr3sh98x Nowicjusz (210 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...