Konkrétní reprezentace grafu se při práci na počítači často liší podle vlastností grafu. Například víme-li, že graf bude mít hodně vrcholů a relativně málo hran, může být matice zbytečné plýtvání pamětí a vyplatí se použít například seznam sousedů.
Speciální kapitolou jsou také dynamické datové struktury, kde se grafy (ještě častěji přímo stromy) za běhu programu velmi mění a celý graf se může několikanásobně zvětšit. Pro používání takovýchto struktur je ale potřeba velmi dobře ovládat práci s pamětí (ukazatele, příkazy jako new (Pascal) či malloc (C)), což výrazně přesahuje rámec této práce.
Graf reprezentovaný maticí
Příklad popisuje graf reprezentovaný maticí sousednosti. Jde o jednoduchý neorientovaný graf bez jakékoliv metriky. Programovací jazyk (prostředí): Pascal (Turbo Pascal 7).
Program přímo žádný algoritmus nepočítá, pouze ukazuje práci s grafem (přidání hrany, odebrání...).
Ukázky programu
Obr. č. 2.24 - Turbo Pascal 7 (programovací prostředí)
Obr. č. 2.25 - Turbo Pascal 7 (běh programu)
Poznámky pro programátory
- Pro matici je použito dvourozměrné pole (typ typ_matice).
- Rozměry matice jsou určené konstantou velikost_matice. Takovéto využití pole o dopředu naalokované paměti brání zvětšování grafu (přidávání nových vrcholů) - oproti dynamickým datovým strukturám.
- Matice se předává procedurám odkazem (nikoliv hodnotou) - matice je tak globální proměnnou, do které procedury zasahují a upravují ji.
- Zaznamenání hrany i odebrání je jednoduché - pouze se změní číslo na souřadnici určené pořadovými čísly vrcholů.
GeSHi © 2004, Nigel McNie
{ Jednoduchy ukazkovy program na reprezentaci grafu pomoci matice sousednosti }
{ Pouziva pouze 1 (je hrana), 0 neni }
{ Z webu http://teorie-grafu.elfineer.cz, Bc. prace z MFF UK, Lukas Jirovsky }
program GRAFMATICE1;
const
velikost_matice = 10;
type
typ_matice = array[1..velikost_matice,1..velikost_matice] of integer;
var
matice1: typ_matice;
procedure vycistiMatici(var matice:typ_matice);
var
i, j: integer;
begin
for i:=1 to velikost_matice do
begin
for j:= 1 to velikost_matice do
begin
matice[i,j]:= 0;
end;
end;
end;
procedure zadejHranu(odkud: integer; kam: integer; var matice:typ_matice);
begin
matice[odkud,kam]:= 1;
matice[kam,odkud]:= 1;
end;
procedure odeberHranu(odkud: integer; kam: integer; var matice:typ_matice);
begin
matice[odkud,kam]:= 0;
matice[kam,odkud]:= 0;
end;
function jeHrana(odkud: integer; kam: integer; var matice:typ_matice):boolean;
begin
if(matice[odkud,kam] = 1) then jeHrana:=true else
jeHrana:=false;
end;
procedure vypisMatici(var matice:typ_matice);
var
i,j: integer;
begin
writeln('Matice:');
for i:=1 to velikost_matice do
begin
for j:= 1 to velikost_matice do
begin
write(matice[i,j]);
end;
writeln;
end;
writeln('--->KONEC MATICE---->');
writeln;
end;
begin
{samotny program}
vycistiMatici(Matice1);
vypisMatici(Matice1);
{zadani nekolika testovacich hran}
zadejHranu(1,2,Matice1);
zadejHranu(2,3,Matice1);
zadejHranu(2,4,Matice1);
vypisMatici(Matice1);
readln;
end.