Macierzowa reprezentacja grafu

0

W jaki sposób mogę zaimplementować macierzową reprezentację grafu, którego węzły są etykietowane wartościami typu string? Gdyby były inty to nie miałbym żadnego problemu bo wtedy a[i][j]=x oznaczałoby, że mamy krawędź z wierzchołka i do wierzchołka j o wadze x. Ale jak to zrobić ze stringami?

1

Najprościej chyba trzymać normalną macierz, tylko po prostu dodać dodatkową tablicę/set w którym trzymasz powiązania etykieta->jej indeks w macierzy.

Czyli żeby znaleźć odległość od "jabłko" do "kamień", sprawdzasz jaki mają indeks (A=GetIndex("Jabłko"), B=GetIndex("kamień")) i sprawdzasz odległość normalnie (odl=Macierz[A][B]).

0

Chyba jeszcze tego nie widzę.

Mam zrobić klasę z potem etykieta typu string i polem indeks typu int?

0

Utwórz słownik, w którym kluczem jest nazwa węzła w grafie, a wartością indeks w macierzy.

0

Nie mam pojęcia jak to wszystko zaimplementować.

0

Nie możesz zrobić tak jak napisałeś w pierwszym poście, z tą różnicą, że typ będzie string?

int n; - liczba wierzchołków
string[n][n] krawdzie;
krawedzie[0][1] = "jajco";

Jeśli krawdzedzie[x][y] == null, to nie są połączone.

0

No nie, bo to oznaczać będzie, że waga krawędzi jest równa "jajco" podczas gdy "jajco" powinno być wartością węzła...

0

A zrób dwie macierze, w jednej trzymaj wagę a w drugiej te stringi.

0

Ok, idee rozumiem. Największy problem polega na tym, że w klasie, która będzie implementowała Graf muszę zawrzeć nastepujące pola:

ilość wierzchołków, ilość krawędzi - łatwe,
macierz sąsiedztwa - czy ma to być dwuwymiarowa tablica rozmiaru ilosc wierzchołków x ilość wierzchołków ?
lista z etykietami - jednowymiarowa tablica?

Podczas pisania programów w c# starałem się omijać mechanizm tablic jak najszerszym łukiem - uważam, że skoro język ten jest językiem wysokiego poziomu, który oferuje rzeczy typu List<T> to używanie tablic jest jakimś nieporozumieniem (rozumiem w czystym C, ale nie tutaj...). W zadaniu mam jednak nie korzystac ze standardowych bibliotek, zatem chyba nie mam wyboru.

Tylko jak ja to mam zrobić, skoro rozmiar tych obu tablic w zasadzie muszę znać na samym początku? Czy rozmiar tych tablic powinienem sobie sam zdefiniować na początku jako jakiś MAX? Da się potem te tablice jakoś powiększać?

0

Nie rozumiesz idei. Potrzebujesz przechowywać informacje o jednoznacznej zależności etykiet grafu z ich pozycjami w macierzy sąsiedztwa. Odnośnie Twojego pytania o rozmiary tablicy, nie musisz ich definiować na sztywno (chociaż to zależy od tego jaki interfejs upubliczniasz). Z tego co się orientuję nie możesz powiększyć tablicy "w miejscu", ale przecież możesz zawsze zbudować nową tablicę na bazie drugiej.

0
satirev napisał(a):

Nie rozumiesz idei. Potrzebujesz przechowywać informacje o jednoznacznej zależności etykiet grafu z ich pozycjami w macierzy sąsiedztwa.

Możesz więc pokazać na jakimś prostym przykładzie jak to ma wyglądać?

Bo ja myślałem, że chodzi o coś takiego, że w tablicy o nazwie etykiety przechowuję stringi w taki sposób, że np. etykiety[0] = "jajco", etykiety[2] = "etykieta wezla 2" itd. czyli każdemu węzłowi przyporządkowuję jakiegoś stringa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1