Informatyka II. Laboratorium.

Podobne dokumenty
Katalog książek cz. 2

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

Programowanie Obiektowe GUI

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

INSTRUKCJA DO ĆWICZENIA 5

Zaawansowane aplikacje WWW - laboratorium

PWŚG Ćwiczenia 13. Ukończoną pracę należy przesłać na adres lub

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Ogólne wiadomości o grafach

Ćwiczenia 9 - Swing - część 1

Klasy i obiekty cz II

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Zofia Kruczkiewicz, Algorytmu i struktury danych, Wykład 14, 1

II Tworzenie klasy Prostokąt dziedziczącej z klasy wątku

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania

PWSG Ćwiczenia 12. Wszystkie ukończone zadania należy wysłać na adres: lub

Laboratorium z informatyki sem.iii/ćw. 4 Wydział Transportu PW /19

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Algorytm Dijkstry znajdowania najkrótszej ścieżki w grafie

Dziedziczenie. Zadanie 1

Język Java część 2 (przykładowa aplikacja)

Lista, Stos, Kolejka, Tablica Asocjacyjna

Wprowadzenie do projektu QualitySpy

Porównanie algorytmów wyszukiwania najkrótszych ścieżek międz. grafu. Daniel Golubiewski. 22 listopada Instytut Informatyki

Informatyka I. Interfejs GUI wysokiego poziomu. Biblioteka Swing. Programowanie zdarzeniowe. Politechnika Warszawska Wydział Transportu 2018

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

1. Algorytmy przeszukiwania. Przeszukiwanie wszerz i w głąb.

- Narzędzie Windows Forms. - Przykładowe aplikacje. Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy

PROJEKTOWANIE ABSTRAKCYJNEJ KLASY FIGURA PRZECHOWUJĄCEJ WSPÓLNE CECHY OBIEKTÓW GRAFICZNYCH

a) 7 b) 19 c) 21 d) 34

Struktury danych i złożoność obliczeniowa Wykład 5. Prof. dr hab. inż. Jan Magott

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Projektowanie aplikacji internetowych laboratorium

Aplikacje internetowe i rozproszone - laboratorium

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

Aplikacje w środowisku Java

Podstawy i języki programowania

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Wykład 4. Tablice. Pliki

Podstawy tworzenia aplikacji z wykorzystaniem języka Java ME ćwiczenia 2

Język Java część 2 (przykładowa aplikacja)

Wstęp do JUNG. Omówione elementy wykorzystane w Edge Color Project

2. Tablice. Tablice jednowymiarowe - wektory. Algorytmy i Struktury Danych

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 3

Przypomnienie o klasach i obiektach

Laboratorium 7 Blog: dodawanie i edycja wpisów

Część II Wyświetlanie obrazów

Zasady programowania Dokumentacja

dr inż. Piotr Czapiewski Tworzenie aplikacji w języku Java Laboratorium 1

Technologie i usługi internetowe cz. 2

Rozdział 4 KLASY, OBIEKTY, METODY

// Potrzebne do memset oraz memcpy, czyli kopiowania bloków

3.4. Opis konfiguracji layoutów.

Ćwiczenie 1: Pierwsze kroki

Aplikacje w środowisku Java

LABORATORIUM 7 Cel: 1_1

Biuro Podróży 0. Stwórz projekt aplikacja konsolowa lub WPF (przemyśl wybór, bo zmiana może być czasochłonna). 1. Stwórz abstrakcyjną klasę

Grafem nazywamy strukturę G = (V, E): V zbiór węzłów lub wierzchołków, Grafy dzielimy na grafy skierowane i nieskierowane:

Laboratorium 8 ( Android -pierwsza aplikacja)

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Kiedy potrzebne. Struktura (rekord) Struktura w języku C# Tablice struktur. struktura, kolekcja

Politechnika Poznańska Wydział Budowy Maszyn i Zarządzania

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Instrukcja 10 Laboratorium 13 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse

ANALIZA I INDEKSOWANIE MULTIMEDIÓW (AIM)

Część XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład.

EGZAMIN - Wersja A. ALGORYTMY I STRUKTURY DANYCH Lisek89 opracowanie kartki od Pani dr E. Koszelew

Podstawy Programowania 2

Typy wyliczeniowe Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.com

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Podstawy obiektowości

Budowa i generowanie planszy

Aplikacje WWW - laboratorium

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

Protokół JDBC współpraca z relacyjnymi bazami danych lab4. Dr inż. Zofia Kruczkiewicz Programowanie aplikacji internetowych

przedmiot kilka razy, wystarczy kliknąć przycisk Wyczaruj ostatni,

Instrukcja z przedmiotu: Zarządzanie dokumentacją techniczną

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

Systemy wirtualnej rzeczywistości. Komponenty i serwisy

Algorytmy grafowe. Wykład 2 Przeszukiwanie grafów. Tomasz Tyksiński CDV

Laboratorium 1 - Programowanie proceduralne i obiektowe

Kontenery i komponenty graficzne

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Tak przygotowane pliki należy umieścić w głównym folderze naszego programu. Klub IKS

TEMAT : KLASY DZIEDZICZENIE

learningpanel - materiały pomocnicze - JAK ZROBIĆ... Jak zrobić...

Programowanie komputerowe. Zajęcia 7

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Języki programowania, wtorek , 12:15-13:45 Zadanie 11 - ostatnie

W dowolnej przeglądarce internetowej należy wpisać poniższy adres:

Transkrypt:

Informatyka II. Laboratorium. Ćwiczenie 13. Reprezentacja grafów w Java. Wyszukiwanie najkrótszej ścieżki w grafie. I. Wstęp. Grafy [1] są podstawową strukturą danych dla wielu algorytmów stosowanych w transporcie. Istnieją różne formy reprezentacji grafów w programie: macierz incydencji, lista sąsiedztwa, etc. [2]. Jedną z najczęściej używanych operacji na grafach jest wyznaczenie najkrótszej ścieżki ze wskazanego wierzchołka. Operacja może być realizowana za pomocą popularnego algorytmu Dijkstry [3]. XML jest uniwersalnym formatem reprezentacji strukturalnych danych. Język Java posiada zaawansowane mechanizmy zapisu oraz odczytu złożonych obiektów w tym języku tzw. serializacja obiektów. Tablica z haszowaniem (tablica mieszająca) do podstawowych struktur danych w programowaniu. Jej zaletą jest szybka adresacja obiektów wg tzw. klucza [5]. Ćwiczenie polega na stworzeniu własnych klas realizujących strukturę grafową, jej wizualizacji na ekranie, implementacji funkcji zapisu struktury do uniwersalnego formatu XML z możliwością ponownego wczytania do programu, oraz realizacji algorytmu Dijkstry. II. Utworzenie projektu i klas podstawowych 1. Utwórz projekt typu ClassLibrary o nazwie Grafy 2. Dodaj do projektu klasę o nazwie Wierzcholek 3. W klasie Wierzcholek zdefiniuj pola publiczne nazwa (String) oraz x, y (int) przechowujące odpowiednio nazwę wierzchołka oraz jego współrzędne na ekranie niezbędne do poprawnej wizualizacji grafu. 4. Dodaj do klasy Wierzcholek pusty konstruktor, który będzie potrzebny do realizacji mechanizmów zapisu oraz odczytu klasy w formacie XML. 5. Dodaj za pomocą menu Insert Constructor konstruktor inicjujący z parametrami: nazwa, x, y 6. Dodaj metodę rysuj w klasie Wierzcholek, rysującą kółko w zadanych współrzędnych public void rysuj(graphics g) { g.setcolor(color.yellow); g.filloval(x-15, y-15, 30, 30); g.setcolor(color.black); g.drawstring(nazwa, x-3, y+5); 7. Dodaj do projektu klasę Krawedz 8. W klasie Krawedz zadeklaruj publiczne pola: dlugosc typu całkowitego oraz wx, wy typu String. Reprezentują one odpowiednio długość krawędzi oraz nazwy wierzchołków przez nią łączone. Krawędź jest skierowana wx->wy. 9. Utwórz pusty konstruktor klasy Krawedz na potrzeby serializacji XML 10. Utwórz za pomocą menu Insert Constructor konstruktor inicjujący klasy Krawedz, za pomocą którego można ustawić początkowe wartości polom dlugosc, wx, wy 11. Dodaj do projektu pustą klasę Graf 12. W klasie Graf zdefiniuj tablicę z haszowaniem, która będzie przechowywała wszystkie wierzchołki. Haszowanie ułatwia dostęp do wierzchołka po jego nazwie, bez konieczności implementacji przeglądania całej listy. HashMap<String, Wierzcholek> wierzcholki = new HashMap<String, Wierzcholek>(); 13. W klasie Graf zdefiniuj listę krawędzi jako tablicę dynamiczną o nazwie krawedzie, z wykorzystaniem klas List oraz ArrayList List<Krawedz> krawedzie = new ArrayList<>(); 14. Zaimplementuj w klasie Graf metodę dodajwierzcholek(), która sprawdza czy wierzchołek o podanej nazwie istnieje: str. 1

void dodajwierzcholek(string nazwa, int x, int y) throws Exception { if (wierzcholki.containskey(nazwa)) { throw new Exception("Wierzchołek o nazwie " + nazwa + " już istnieje!"); Wierzcholek w = new Wierzcholek(nazwa, x, y); wierzcholki.put(nazwa, w); 15. Zaimplementuj w klasie Graf metodę pomocniczą dodajkrawedz(), za pomocą której można będzie połączyć dwa wierzchołki wskazane przez ich nazwy void dodajkrawedz(string wx, String wy, int dlugosc) { Wierzcholek w1 = (Wierzcholek) wierzcholki.get(wx); Wierzcholek w2 = (Wierzcholek) wierzcholki.get(wy); Krawedz k = new Krawedz(dlugosc, w1.nazwa, w2.nazwa); krawedzie.add(k); 16. Zdefiniuj w klasie Graf metodę rysuj z parametrem Graphics public void rysuj(graphics g) {. 17. Umieść w metodzie rysuj() instrukcję ustawiającą czarny kolor linii 18. Umieść w metodzie rysuj() instrukcje rysowania krawędzi for (Krawedz k : krawedzie) { Wierzcholek wx = (Wierzcholek) wierzcholki.get(k.wx); Wierzcholek wy = (Wierzcholek) wierzcholki.get(k.wy); g.drawline(wx.x, wx.y, wy.x, wy.y); g.drawstring(k.dlugosc + "", wx.x + (wy.x - wx.x)/2, wx.y + (wy.y - wx.y)/2); 19. Umieść w metodzie rysuj() instrukcje rysowania wierzchołków for (Wierzcholek w : wierzcholki.values()) { w.rysuj(g); 20. Sprawdź czy projekt kompiluje się poprawnie, i jeśli tak to przejdź do pkt. III. III. Wizualizacja grafu 21. Dodaj do projektu klasę OknoGlowne typu JFrame; ustaw w konstruktorze domyślny rozmiar jako 800x700 pix. W klasie OknoGlowne zadeklaruj i utwórz obiekt klasy Graf o nazwie graf. 22. W trybie Design dodaj do okna element MenuBar realizujący menu główne programu 23. Zmień w menu głównym napisy elementów na Plik i Graf 24. Do menu Plik dodaj podmenu Wyjście i oprogramuj je umieszczając w metodzie obsługi zdarzenia kod: setvisible(false); dispose(); 25. Sprawdź czy program działa tzn. uruchamia się, wyświetla okno główne i kończy działanie po wybraniu menu Wyjście. 26. Utwórz w klasie OknoGlowne klasę wewnętrzną PanelGraf dziedziczącą z klasy JPanel, za pomocą której można będzie dokonać wizualizacji grafu. Instancja klasy PanelGraf o nazwie panel powinna być zlokalizowana na ekranie okna głównego w pozycji (200,10) oraz mieć wymiary 570x620. 27. Nadpisz w klasie PanelGraf metodę paintcomponent(). 28. Umieść w metodzie paintcomponent() instrukcje wypełniające tło kolorem białym 29. Umieść w metodzie paintcomponent() wywołanie metody rysuj() na obiekcie graf klasy Graf 30. Dodaj do menu Graf podmenu Utwórz przykładowy, następnie dodaj w klasie OknoGlowne metodę obsługi zdarzenia actionperformed ww. menu str. 2

31. W ww. metodzie umieść instrukcje tworzące nowy graf poprzez dodanie jego wierzchołków a następnie krawędzi graf = new Graf(); graf.dodajwierzcholek("a", 30, 500); graf.dodajwierzcholek("b", 200, 550); // tu dodaj samodzielnie wierzchołki C, D, E i F // zgodnie z rysunkiem graf.dodajkrawedz("a", "B", 7); graf.dodajkrawedz("a", "C", 9); graf.dodajkrawedz("b", "C", 10); // tu dodaj samodzielnie krawędzie // zgodnie z rysunkiem panel.repaint(); catch (Exception ex) { 32. Uzupełnij strukturę grafu o brakujące wierzchołki i krawędzie zgodnie z rys. 33. Sprawdź działanie programu 34. Zgłoś wykonanie zadania wykładowcy. Porównaj wygląd Twojego grafu a grafu wzorcowego. IV. Zapis i odczyt grafu w formacie XML 35. Dodaj atrybuty @XmlRootElement do deklaracji klas Graf, Wierzcholek oraz Krawedz @XmlRootElement public class Graf { 36. Dodaj atrybuty @XmlElement do wszystkich pól klas Graf, Wierzcholek oraz Krawedz, które masz zamiar zapisać do pliku XML, na wzór: @XmlElement List<Krawedz> krawedzie = new ArrayList<>(); 37. W metodzie obsługi zdarzenia actionperformed menu Graf => Zapisz umieść następujący kod: // zapisz graf do pliku // plik wyjściowy File file = new File("graf.xml"); // format obiektu na podstawie typu danych JAXBContext struktura = JAXBContext.newInstance(Graf.class); // obiekt - tzw. formatter XML Marshaller xml = struktura.createmarshaller(); xml.setproperty(marshaller.jaxb_formatted_output, true); // zapis do pliku XML xml.marshal(graf, file); JOptionPane.showMessageDialog(this, "Sukces"); catch (Exception ex) { 38. Sprawdź czy zapis do pliku XML działa tj. czy plik XML powstaje i jaka jest jego zawartość str. 3

39. W metodzie obsługi zdarzenia actionperformed menu Graf => Wczytaj umieść następujący kod: // wczytaj graf z pliku // plik wyjściowy File file = new File("graf.xml"); // format obiektu na podstawie typu danych JAXBContext struktura = JAXBContext.newInstance(Graf.class); // klasa realizująca odczyt z XML Unmarshaller xml = struktura.createunmarshaller(); // odczyt obiektu z pliku oraz jego konwersja na typ Graf graf = (Graf) xml.unmarshal(file); JOptionPane.showMessageDialog(this, "Sukces"); catch (JAXBException ex) { panel.repaint(); 40. Zamknij i ponownie uruchom program 41. Wczytaj strukturę grafu z pliku XML za pomocą menu Graf => Wczytaj. Upewnij się że graf ma identyczną strukturę jak ten wzorcowy 42. Otwórz plik XML w notatniku do edycji i dodaj w tekście definicję wierzchołka H i prowadzących ku niemu krawędzi (wyróżnione kolorem czerwonym na rys.) 43. Wczytaj zmodyfikowany plik do programu i sprawdź jego wizualizację V. Wyszukiwanie najmniejszej odległości od wskazanego wierzchołka do pozostałych 44. Zapoznaj się z algorytmem E. Dijkstry wyznaczania najkrótszej ścieżki w grafie. 45. Dodaj do klasy Wierzcholek publiczne pole typu całkowitego o nazwie L, które będzie przechowywało odległość od wskazanego początkowego wierzchołka. Uzupełnij pole L deklaracją @XmlTransient (nie zapisuj tego do pliku XML) 46. Dodaj do klasy Wierzcholek publiczne pole typu logicznego o nazwie odwiedzony, które będzie wskazywało na obsługę pola w algorytmie Dijkstry. Również oznakuj go jako @XmlTransient str. 4

47. Zmień w metodzie rysuj() klasy Wierzcholek instrukcję drawstring na: g.drawstring(nazwa + ", L="+L, x-3, y+5); 48. Uruchom program i sprawdź czy odległość L jest wyświetlana obok nazwy wierzchołka 49. Dodaj do klasy Graf metodę zerujodleglosci(), która ustawia dla każdego wierzchołka wartość odwiedzony = false oraz odległość L jako nieskończoną for (Wierzcholek w : wierzcholki.values()) { w.l = Integer.MAX_VALUE; // nieskończoność w.odwiedzony = false; 50. Zadeklaruj w klasie Graf metodę wyznaczenia odległości jako public void wyznaczodleglosci(wierzcholek w) 51. Na początku metody zadeklaruj obiekt klasy Krawedz, który dla każdego kroku iteracji algorytmu będzie wskazywał na najkrótszą krawędź wychodzącą z bieżącego wierzchołka Krawedz nk = null;// najkrótsza nieodwiedzona krawędź z wierzchołka W 52. Niżej umieść instrukcję cyklicznego przeglądania wszystkich krawędzi w grafie for (Krawedz k : krawedzie) { // tu umieść kolejne instrukcje 53. Wewnątrz pętli for umieść instrukcje pobierające dwa obiekty typu Wierzcholek po ich nazwie Wierzcholek wx = (Wierzcholek) wierzcholki.get(k.wx); Wierzcholek wy = (Wierzcholek) wierzcholki.get(k.wy); 54. Niżej dodaj instrukcje sprawdzenia czy kolejna krawędź k łączy bieżący wierzchołek w z jeszcze nie odwiedzonym wierzchołkiem // szukamy niesprawdzonych jeszcze sąsiadów W Wierzcholek sasiad = null; if( wx.equals(w) &&!wy.odwiedzony ) sasiad = wy; if( wy.equals(w) &&!wx.odwiedzony ) sasiad = wx; 55. Sprawdź czy znaleziono wierzchołek spełniający powyższe warunki if (sasiad!= null) { // tu umieść dalsze instrukcje 56. Oblicz długość ścieżki z wierzchołka początkowego do wierzchołka sąsiadującego z bieżącym, uwzględniając długość krawędzi int P = w.l + k.dlugosc; // długość ścieżki do kolejnego "sąsiada" Jeśli obliczona długość ścieżki jest mniejsza niż dotychczas wyliczono dla wierzchołka sąsiadującego, oznacza to że znaleziono krótszą ścieżkę. Należy wówczas zaktualizować wartość L we wskazanym wierzchołku: if (sasiad.l > P) { // aktualizacja długości ścieżki sasiad.l = P; 57. Niżej dodaj instrukcje, za pomocą których zmienna pomocnicza nk będzie wskazywała na najkrótszą ścieżkę do następnego wierzchołka (tzw. podejście zachłanne polegające na tym że na każdym kroku wybieramy najbardziej rokujące lokalne założenie) if (nk == null k.dlugosc < nk.dlugosc) { nk = k; // najbliższy sąsiad 58. Poza pętlą for umieść instrukcję zaznaczającą że wierzchołek bieżący został już odwiedzony i nie będzie ponownie analizowany, tj. jego odległość od początkowego nie ulegnie zmianie. w.odwiedzony = true; // już nie wracamy do tego wierzchołka str. 5

59. Sprawdź czy wszystkie wierzchołki zostały odwiedzone, i jeśli tak wyjdź z metody if (nk == null) { return; // wszystkie wierzchołki zostały odwiedzone 60. Jeśli nie wszystkie wierzchołki zostały odwiedzone, sprawdź który najbardziej się nadaje do dalszych iteracji Wierzcholek nw = null; // następny analizowany wierzchołek if( nk.wx.equals(w.nazwa) ) nw = (Wierzcholek) wierzcholki.get(nk.wy); else nw = (Wierzcholek) wierzcholki.get(nk.wx); 61. a następne rekurencyjnie wywołaj metodę wyznaczania odległości dla tego wierzchołka (do którego prowadzi najkrótsza krawędź nk) wyznaczodleglosci(nw); 62. Skompiluj program i sprawdź i naprawę ewentualne błędy 63. Przejdź do trybu Design okna głównego programu 64. Umieść w górnym lewym rogu przycisk Wyznacz odległości 65. W metodzie obsługi zdarzenia actionperformed() przycisku Wyznacz umieść kod graf.zerujodleglosci(); // początkowy wierzchołek Wierzcholek w = graf.wierzcholki.get("a"); // odległość do samego siebie zawsze wynosi 0 w.l = 0; graf.wyznaczodleglosci(w); panel.repaint(); JOptionPane.showMessageDialog(this, "Sukces"); catch (Exception ex) { 66. Przeanalizuj powyższy kod. 67. Uruchom program i sprawdź działanie programu 68. Zgłoś wynik wykonania programu wykładowcy. Ile wynosi najkrótsza odległość od A do D? 69. Dodaj do GUI pole tekstowe, w którym można będzie wprowadzać nazwę początkowego wierzchołka, od którego będą wyznaczane odległości 70. Zmodyfikuj kod programu tak, by pobierał nazwę początkowego wierzchołka z pola tekstowego 71. Oblicz odległości do pozostałych wierzchołków, podstawiając kolejno w pole tekstowe nazwy B G Zadania do samodzielnego wykonania 72. Uzupełnij program o możliwość edycji grafu (np. dodawanie nowego wierzchołka lub krawędzi) z poziomu GUI (3 pkt). 73. Zmodyfikuj algorytm wyznaczania ścieżki tak, by na koniec wyświetlał całą najkrótszą ścieżkę pomiędzy dwoma wyznaczonymi wierzchołkami (5 pkt) str. 6

Bibliografia [1] Definicja grafu: https://pl.wikipedia.org/wiki/graf_(matematyka) [2] Formy reprezentacji grafów w programie: https://eduinf.waw.pl/inf/alg/001_search/0124.php [3] Algorytm Dijkstry: https://pl.wikipedia.org/wiki/algorytm_dijkstry [4] Język XML: https://pl.wikipedia.org/wiki/xml [5] Tablica z haszowaniem str. 7