Jedną z technik optymalizacji kodu asemblerowego generowanego przez kompilator języka wysokiego poziomu jest szeregowanie bloków bazowych w celu minimalizacji liczby skoków. Blok bazowy jest ciągiem kolejnych rozkazów asemblerowych spełniającym następujące warunki:
Twoim zadaniem jest napisanie programu, który bazując na informacji zwrotnej profilera zawierającej dane o częstościach przejść między blokami bazowymi, obliczy ile rozkazów skoków byłoby wykonanych, gdyby w badanym programie bloki bazowe były uszeregowane w sposób optymalny.
W pierwszym wierszu danych wejściowych znajduje się pojedyncza liczba całkowita C oznaczająca liczbę zestawów danych. Dalej znajdują się kolejne zestawy danych.
Pierwszy wiersz zestawu danych zawiera pojedynczą liczbę całkowitą N oznaczającą liczbę bloków bazowych w badanym programie. W kolejnych N wierszach znajdują się opisy przejść wychodzących z kolejnych bloków bazowych. Na początku każdego z tych wierszy znajduje się nazwa początkowego bloku bazowego, będąca jedną z N pierwszych małych liter alfabetu angielskiego (litery od 's' do 'z' są zarezerwowane do innych celów, więc nie pojawiają się w danych wejściowych). Dalej występuje znak strzałki „->”, a następnie liczba M (0 ≤ M ≤ N) oznaczająca liczbę bloków bazowych, do których prowadzą skoki. Pozostała część wiersza zawiera M par, w których pierwszym elementem jest nazwa docelowego bloku bazowego, a drugim liczba przejść odnotowanych przez program profilujący. Wszystkie te elementy pooddzielane są spacjami.
Uwagi:
Dane wyjściowe zawierają C wierszy (po jednym dla każdego zestawu danych), które zawierają wyniki dla kolejnych zestawów danych, w kolejności identycznej jak w danych wejściowych. Odpowiedzią dla pojedynczego zestawu danych jest pojedyncza liczba całkowita oznaczająca całkowitą liczbę skoków, jakie byłyby wykonane, gdyby bloki bazowe były uszeregowane w sposób optymalny.
2 8 a -> 2 b 5 f 6 b -> 2 c 3 d 2 c -> 1 d 3 d -> 1 f 6 e -> 1 d 1 f -> 1 g 12 g -> 3 a 10 e 1 h 1 h -> 0 7 a -> 2 b 5 f 6 b -> 2 c 3 d 2 c -> 1 d 3 d -> 1 f 6 e -> 1 d 1 f -> 1 g 12 g -> 2 a 10 e 1
20 22
Dla przykładowych danych optymalne sekwencje bloków bazowych są następujące:
abcdfgeh abcedfg