Propozycje tematów projektów zaliczeniowych

UWAGI OGÓLNE

W celu zaliczenia ćwiczeń z AiSD należy:
(1) zaliczyć 10 zestawów zadań,
(2) zaliczyć dwa kolokwia,
(3) zaliczyć projekt programistyczny w C++ [kod plus dokumentacja (README.md, HTML, PDF); minimum 100 wierszy kodu; nie używać using namespace std;; Makefile do kompilacji z flagami -Wall -std=c++11 (może być nowszy standard C++)].

Możliwe sposoby przesyłania rozwiązań zestawów zadań:
(1) email z linkiem do repozytorium w serwisie GitHub, gdzie składowane są kody źródłowe programów,
(2) email z linkiem do archiwum ZIP w chmurze UJ,
(3) email z archiwum ZIP w załączniku.

GRAFY

GEOMETRIA

PRZEMYTNICY (Olimpiada Informatyczna 2003)

Bajtocja słynie z bogatych złóż złota, dlatego przez długie lata kwitła sprzedaż tego kruszcu do sąsiedniego królestwa, Bitlandii. Niestety, powiększająca się ostatnio dziura budżetowa zmusiła króla Bitlandii do wprowadzenia zaporowych ceł na metale i minerały. Handlarze przekraczający granicę muszą zapłacić 50% wartości przewożonego ładunku. Bajtockim kupcom grozi bankructwo.

Na szczęście bajtoccy alchemicy opracowali sposoby pozwalające zamieniać pewne metale w inne. Pomysł kupców polega na tym, aby z pomocą alchemików zamieniać złoto w pewien tani metal, a następnie, po przewiezieniu go przez granicę i zapłaceniu niewielkiego cła, znowu otrzymywać z niego złoto. Niestety alchemicy nie znaleźli sposobu na zamianę dowolnego metalu w dowolny inny. Może się więc zdarzyć, że proces otrzymywania danego metalu ze złota musi przebiegać wielostopniowo i że na każdym etapie uzyskiwany będzie inny metal. Alchemicy każą sobie słono płacić za swoje usługi i dla każdego znanego sobie procesu zamiany metalu A w metal B wyznaczyli cenę za przemianę 1kg surowca. Handlarze zastanawiają się, w jakiej postaci należy przewozić złoto przez granicę oraz jaki ciąg procesów alchemicznych należy zastosować, aby zyski były możliwie największe.

Zadanie. Pomóż uzdrowić bajtocką gospodarkę! Napisz program, który:

(1) Wczyta tabelę cen wszystkich metali, a także ceny przemian oferowanych przez alchemików.

(2) Wyznaczy taki ciąg metali m_0, m_1, ..., m_k, że:
(a) m_0 = m_k to złoto,
(b) dla każdego i = 1, 2, ..., k alchemicy potrafią otrzymać metal m_i z metalu m_{i-1}, oraz
(c) koszt wykonania całego ciągu procesów alchemicznych dla 1kg złota powiększony o płacone na granicy cło (50% ceny 1kg najtańszego z metali m_i, dla i = 0, 1, ..., k) jest najmniejszy z możliwych.
Zakładamy, że podczas procesów alchemicznych waga metali nie zmienia się.

(3) Wypisze koszt wykonania wyznaczonego ciągu procesów alchemicznych powiększony o płacone na granicy cło.

Wejście. W pierwszym wierszu standardowego wejścia znajduje się jedna dodatnia liczba całkowita n oznaczająca liczbę rodzajów metali, 1 ≤ n ≤ 5000.
W wierszu o numerze k+1, dla 1 ≤ k ≤ n, znajduje się nieujemna parzysta liczba całkowita p_k - cena 1kg metalu oznaczonego numerem k, 0 ≤ p_k ≤ 10^9. Przyjmujemy, że złoto ma numer 1.
W wierszu o numerze n+2 znajduje się jedna nieujemna liczba całkowita m równa liczbie procesów przemiany znanych alchemikom, 0 ≤ m ≤ 100000.
W każdym z kolejnych m wierszy znajdują się po trzy liczby naturalne, pooddzielane pojedynczymi odstępami, opisujące kolejne przemiany. Trójka liczb a,b,c oznacza, że alchemicy potrafią z metalu o numerze a otrzymać metal o numerze b i za zamianę 1kg surowca każą płacić c bajtalarów, 1 ≤ a,b ≤ n, 0 ≤ c ≤ 10000. Uporządkowana para liczb a i b może się pojawić w danych co najwyżej jeden raz.

Wyjście. Twój program powinien pisać na standardowe wyjście. W pierszym wierszu powinna zostać wypisana jedna liczba całkowita - koszt wykonania wyznaczonego ciągu procesów alchemicznych powiększony o płacone na granicy cło.

Przykład.


# Dla danych wejściowych:
4
200
100
40
2
6
1 2 10
1 3 5
2 1 25
3 2 10
3 4 5
4 1 50
# poprawnym wynikiem jest:
60