Wpisany przez Tomasz Lubiński,
09 sierpnia 2005 19:42
Jeżeli należy wygenrować graf o zadanym ciągu stopni wierzchołków najpierw należy sprawdzić czy taki graf istnieje, czyli czy ciąg stopni jest graficzny. Można więc powiedzieć, ze dany ciąg liczb c=c1, c2, ..., cn jest graficzny jezeli istnieje graf o n wierzchołkach, dla którego c jest ciągiem stopni wierzchołków. Na przykład nie da się wygenerować grafu o 4 wierzchołkach i ciągu stopni 2,2,2,1.
Algorytm testowania czy ciąg jest graficzny przebiega następująco:
n=5, c=2,3,2,3,2
posorutj ciąg: c=3,3,2,2,2
odejmij 1 od od c1 elementów ciągu począwszy od c2 podstaw 0 do c1 c=0,2,1,1,2
posorutj ciąg: c=2,2,1,1,0
odejmij 1 od od c1 elementów ciągu począwszy od c2 podstaw 0 do c1 c=0,1,0,1,0
posorutj ciąg: c=1,1,0,0,0
odejmij 1 od od c1 elementów ciągu począwszy od c2 podstaw 0 do c1 c=0,0,0,0,0
w ciągu zostały same zera a więc ciąg c=2,3,2,3,2
jest graficzny.
Przykład 2
n=5, c=1,4,2,3,1
posorutj ciąg: c=4,3,2,1,1
odejmij 1 od od c1 elementów ciągu począwszy od c2 podstaw 0 do c1 c=0,2,1,0,0
posorutj ciąg: c=2,1,0,0,0
w ciągu c począwszy od drugiego elementu nie ma c1 elementów o wartościach dodatnich a więc ciąg ten nie jest graficzny
Algorytm ten po pewnych modyfikacjach można wykorzystać do zdbudowania grafu o zadanym ciągu wierzchołków. Należy wierzchołek o maksymalnym stopniu w danej iteracji łączyć z wierzchołkami, w których zmniejszamy stopień o jeden. Ciag c musi w tym wypadku być ciągiem rekordów wartości i numeru wierzchołka, bo podczas losowania zmienia się kolejność ustawienia wierzchołków.
Algorytm testowania czy ciąg jest graficzny przebiega następująco:
- Posortuj ciąg c nierosnąco
- Jeżeli wszystkie wyrazy ciagu są równe zeru to ciąg jest graficzny (czyli po posortowaniu c1 jest równe 0)
- Jeżeli w ciągu c począwszy od drugiego elementu jest co najmniej c1 elementów o wartościach dodatnich, to odejmij 1 od c1 elementów ciągu począwszy od c2, podstaw 0 do c1 i wróc do kroku 1. Jeżeli w ciągu nie ma wystarczającej liczby elementów dodatnich to znaczy, że ciąg c nie jest graficzny
n=5, c=2,3,2,3,2
posorutj ciąg: c=3,3,2,2,2
odejmij 1 od od c1 elementów ciągu począwszy od c2 podstaw 0 do c1 c=0,2,1,1,2
posorutj ciąg: c=2,2,1,1,0
odejmij 1 od od c1 elementów ciągu począwszy od c2 podstaw 0 do c1 c=0,1,0,1,0
posorutj ciąg: c=1,1,0,0,0
odejmij 1 od od c1 elementów ciągu począwszy od c2 podstaw 0 do c1 c=0,0,0,0,0
w ciągu zostały same zera a więc ciąg c=2,3,2,3,2
jest graficzny.
Przykład 2
n=5, c=1,4,2,3,1
posorutj ciąg: c=4,3,2,1,1
odejmij 1 od od c1 elementów ciągu począwszy od c2 podstaw 0 do c1 c=0,2,1,0,0
posorutj ciąg: c=2,1,0,0,0
w ciągu c począwszy od drugiego elementu nie ma c1 elementów o wartościach dodatnich a więc ciąg ten nie jest graficzny
Algorytm ten po pewnych modyfikacjach można wykorzystać do zdbudowania grafu o zadanym ciągu wierzchołków. Należy wierzchołek o maksymalnym stopniu w danej iteracji łączyć z wierzchołkami, w których zmniejszamy stopień o jeden. Ciag c musi w tym wypadku być ciągiem rekordów wartości i numeru wierzchołka, bo podczas losowania zmienia się kolejność ustawienia wierzchołków.
Implementacje
Autor | Język programowania | Komentarz | Otwórz | Pobierz | Ocena |
Tomasz Lubiński | C/C++ | .cpp | .cpp | ***** / 2 | |
Tomasz Lubiński | Delphi/Pascal | .pas | .pas | ***** / 1 | |
Tomasz Lubiński | Java | .java | .java | ***** / 1 |
Poprawiony: 27 maja 2010 18:52
bubble_sort(Lis t,Sorted):-b_sort(List,[], Sorted).
b_sort([],Acc,A cc).
b_sort([H|T],Ac c,Sorted):-bubble(H,T,NT,M in),b_sort(NT,[ Min|Acc],Sorted ).
bubble(X,[],[], X).
bubble(X,[Y|T], [Y|NT],Min):-X=Y,bubble(Y,T,NT ,Min).
zmiejsz(H, 0, H).
zmiejsz([Hs|Ts] , Ile, [Hd|Td]) :- Ile > 0, Hd is Hs-1, Ile2 is Ile-1, zmiejsz(Ts, Ile2, Td).
czy_zerowe([0]) .
czy_zerowe([H|T ]) :- H = 0, czy_zerowe(T).
czy_ujemne([H|T ]) :- H < 0 ; czy_ujemne(T).