marci@9
|
1 |
ETIK-OL-NOLIB-NEGRES graph concept-ek.
|
marci@9
|
2 |
|
marci@9
|
3 |
Ebben a dokumentacioban graph concept tervek es azok megvalositastarol irok.
|
marci@9
|
4 |
A felsorolt rutinok, osztalyok egyaltalan nem kikristalyosodottak, 1-1 elemi
|
marci@9
|
5 |
operacio elegzesere gyakran tobb mod is rendelkezesre all. A tervezesi fazisban pont annak kell kiderulnie, hogy milyen metodusok tavolithatok el, s milyen
|
marci@9
|
6 |
ujakra van szukseg.
|
marci@9
|
7 |
|
marci@9
|
8 |
Megvalositottunk egy graph osztalyt mely listaban tarolja a pontokat,
|
marci@9
|
9 |
az 1 pontbol kiindulo eleket, s az 1 pontba bemeno eleket. Konstrualni lehet
|
marci@9
|
10 |
ures grafot, hozzaadni pontokat, eleket. Az incidenciat node_iteratorok-kal
|
marci@9
|
11 |
ill. edge_iteratorokkal lehet megfigyelni. Adott tovabba 1 template osztaly,
|
marci@9
|
12 |
a graf pontjaihoz vagy eleihez tetszoleges tipusu property hozzarendelesere,
|
marci@9
|
13 |
a jelen megvalositas ezeket vektorben tarolja. Fontos azonban, hogy ezen
|
marci@9
|
14 |
property_vector csak azokra a graf-objektumokra ervenyes, melyek
|
marci@9
|
15 |
letrehozasanak pillanataban a grafhoz tartoznak.
|
marci@9
|
16 |
|
marci@9
|
17 |
marci_bfs.hh //bfs, tejesen kiserleti
|
marci@9
|
18 |
marci_graph_demo.cc //peldaprogi a lisas graf hasznalatahoz
|
marci@9
|
19 |
marci_graph_traits.hh //alapertelmezett graph_traits
|
marci@9
|
20 |
marci_list_graph.hh //list_graph megvalositas
|
marci@9
|
21 |
marci_max_flow.hh //folyam, kiserleti
|
marci@9
|
22 |
marci_property_vector.hh //property vector megvalosites indexelt grafokhoz
|
marci@9
|
23 |
graf es iterator tipusok:
|
marci@9
|
24 |
|
marci@9
|
25 |
class list_graph
|
marci@9
|
26 |
|
marci@9
|
27 |
class node_iterator
|
marci@9
|
28 |
trivialis node iterator, csak cimezni lehet vele, pl property vectort
|
marci@9
|
29 |
|
marci@9
|
30 |
class each_node_iterator
|
marci@9
|
31 |
node iterator a graf pontjainak bejarasara, node_iterator-a konvertalhato
|
marci@9
|
32 |
|
marci@9
|
33 |
class edge_iterator
|
marci@9
|
34 |
trivialis edge iterator, csak cimezni lehet vele, pl property vectort
|
marci@9
|
35 |
|
marci@9
|
36 |
class each_edge_iterator
|
marci@9
|
37 |
edge iterator a graf osszes elenek bejarasara
|
marci@9
|
38 |
|
marci@9
|
39 |
class out_edge_iterator
|
marci@9
|
40 |
edge iterator 1 pont ki eleinek bejarasara, edge_iterator-a konvertalhato
|
marci@9
|
41 |
|
marci@9
|
42 |
class in_edge_iterator
|
marci@9
|
43 |
edge iterator 1 pont be eleinek bejarasara, edge_iterator-a konvertalhato
|
marci@9
|
44 |
|
marci@9
|
45 |
class sym_edge_iterator
|
marci@9
|
46 |
edge iterator 1 pont be es ki eleinek bejarasara, edge_iterator-a konvertalhato
|
marci@9
|
47 |
|
marci@9
|
48 |
default constructor:
|
marci@9
|
49 |
|
marci@9
|
50 |
list_graph()
|
marci@9
|
51 |
|
marci@9
|
52 |
A graf osztaly fobb publikus metodusai, az alapveto hasznalathoz:
|
marci@9
|
53 |
Hasonlo funkciok megvalosithatok 1 kesobb leirt modon, illetve
|
marci@9
|
54 |
ezek kozul nehany az iteratorok metodusaival, megis azt javasolnam, hogy az
|
marci@9
|
55 |
iteratorok metodusait ne hasznaljuk. Miert? Azt szeretnenk, ha 1 ponthalmazon
|
marci@9
|
56 |
van 2 graf, es csak az elhalmazhoz keszitunk uj iteratorokat, akkor pl 1 pont
|
marci@9
|
57 |
out-edge-iteratora megkaphato legyen a grafbol es a node_iteratorbol. Ezert
|
marci@9
|
58 |
out_edge_iterator(const node_iterator&) hasznalata nem javasolt,
|
marci@9
|
59 |
esetleg majd szamuzzuk a concept-bol, s akkor nem nesz baj.
|
marci@9
|
60 |
|
marci@9
|
61 |
each_node_iterator first_node()
|
marci@9
|
62 |
each_edge_iterator first_edge()
|
marci@9
|
63 |
out_edge_iterator first_out_edge(const node_iterator&)
|
marci@9
|
64 |
in_edge_iterator first_in_edge(const node_iterator&)
|
marci@9
|
65 |
sym_edge_iterator first_sym_edge(const node_iterator&)
|
marci@9
|
66 |
|
marci@9
|
67 |
node_iterator tail(const edge_iterator&)
|
marci@9
|
68 |
node_iterator head(const edge_iterator&)
|
marci@9
|
69 |
|
marci@9
|
70 |
node_iterator a_node(const out_edge_iterator&)
|
marci@9
|
71 |
node_iterator a_node(const in_edge_iterator&)
|
marci@9
|
72 |
node_iterator a_node(const sym_edge_iterator&)
|
marci@9
|
73 |
//az out, in or sym edge iterator rogzitett pontjara ad 1 node_iterator-t
|
marci@9
|
74 |
|
marci@9
|
75 |
node_iterator b_node(const out_edge_iterator&)
|
marci@9
|
76 |
node_iterator b_node(const in_edge_iterator&)
|
marci@9
|
77 |
node_iterator b_node(const sym_edge_iterator&)
|
marci@9
|
78 |
//az out, in or sym edge iterator nem rogzitett pontjara ad 1 node_iterator-t
|
marci@9
|
79 |
|
marci@9
|
80 |
node_iterator invalid_node()
|
marci@9
|
81 |
edge_iterator invalid_edge()
|
marci@9
|
82 |
out_edge_iterator invalid_out_edge()
|
marci@9
|
83 |
in_edge_iterator invalid_in_edge()
|
marci@9
|
84 |
sym_edge_iterator invalid_sym_edge()
|
marci@9
|
85 |
|
marci@9
|
86 |
//az iteratorok ures konstruktorai meghatarozatlan
|
marci@9
|
87 |
tartalmu konstruktort adnak vissza, ezekkel a matodusokkal
|
marci@9
|
88 |
lehet ervenytelent csinalni.
|
marci@9
|
89 |
Lehet hogy ezt az ures konstruktorral kellene, tessek vitatkozni.
|
marci@9
|
90 |
|
marci@9
|
91 |
Kiserleti cellal ugyanezen fv-ek mas stilusu megvalositasai:
|
marci@9
|
92 |
|
marci@9
|
93 |
void get_first(each_node_iterator&)
|
marci@9
|
94 |
void get_first(each_edge_iterator&)
|
marci@9
|
95 |
void get_first(out_edge_iterator&, const node_iterator&)
|
marci@9
|
96 |
void get_first(in_edge_iterator&, const node_iterator&)
|
marci@9
|
97 |
void get_first(sym_edge_iterator&, const node_iterator&)
|
marci@9
|
98 |
|
marci@9
|
99 |
void get_tail(node_iterator&, const edge_iterator&)
|
marci@9
|
100 |
void get_head(node_iterator&, const edge_iterator&)
|
marci@9
|
101 |
|
marci@9
|
102 |
void get_a_node(node_iterator&, const out_edge_iterator&)
|
marci@9
|
103 |
void get_a_node(node_iterator&, const in_edge_iterator&)
|
marci@9
|
104 |
void get_a_node(node_iterator&, const sym_edge_iterator&)
|
marci@9
|
105 |
|
marci@9
|
106 |
void get_b_node(node_iterator&, const out_edge_iterator&)
|
marci@9
|
107 |
void get_b_node(node_iterator&, const in_edge_iterator&)
|
marci@9
|
108 |
void get_b_node(node_iterator&, const sym_edge_iterator&)
|
marci@9
|
109 |
|
marci@9
|
110 |
void get_invalid(node_iterator&)
|
marci@9
|
111 |
void get_invalid(edge_iterator&)
|
marci@9
|
112 |
void get_invalid(out_edge_iterator&)
|
marci@9
|
113 |
void get_invalid(in_edge_iterator&)
|
marci@9
|
114 |
void get_invalid(sym_edge_iterator&)
|
marci@9
|
115 |
|
marci@9
|
116 |
Pontok azonositasara de meginkabb property vectorokhoz:
|
marci@9
|
117 |
|
marci@9
|
118 |
int id(const node_iterator&)
|
marci@9
|
119 |
int id(const edge_iterator&)
|
marci@9
|
120 |
|
marci@9
|
121 |
Pontok es elek hozzaadasanak metodusai:
|
marci@9
|
122 |
|
marci@9
|
123 |
node_iterator add_node()
|
marci@9
|
124 |
edge_iterator add_edge(const node_iterator&, const node_iterator&)
|
marci@9
|
125 |
|
marci@9
|
126 |
Hogy konnyebb legyen a progikat tesztelni, nehany stream utasitas:
|
marci@9
|
127 |
ezek nem a list_graph metodusai
|
marci@9
|
128 |
|
marci@9
|
129 |
friend std::ostream& operator<<(std::ostream&, const node_iterator&)
|
marci@9
|
130 |
friend std::ostream& operator<<(std::ostream&, const edge_iterator&)
|
marci@9
|
131 |
|
marci@9
|
132 |
node_iterator metodusai:
|
marci@9
|
133 |
node_iterator()
|
marci@9
|
134 |
bool is_valid()
|
marci@9
|
135 |
ezek nem tagfuggvenyek:
|
marci@9
|
136 |
friend bool operator==(const node_iterator&, const node_iterator&)
|
marci@9
|
137 |
friend bool operator!=(const node_iterator& u, const node_iterator& v)
|
marci@9
|
138 |
|
marci@9
|
139 |
each_node_iterator metodusai:
|
marci@9
|
140 |
ez publikusan szarmazik a node_iterator-bol, tehat a fentiek is.
|
marci@9
|
141 |
each_node_iterator()
|
marci@9
|
142 |
each_node_iterator& operator++()
|
marci@9
|
143 |
|
marci@9
|
144 |
edge_iterator metodusai:
|
marci@9
|
145 |
edge_iterator()
|
marci@9
|
146 |
bool is_valid()
|
marci@9
|
147 |
ezek nem tagfvek:
|
marci@9
|
148 |
friend bool operator==(const edge_iterator&, const edge_iterator&)
|
marci@9
|
149 |
friend bool operator!=(const edge_iterator&, const edge_iterator&)
|
marci@9
|
150 |
ujra tagfv-ek.
|
marci@9
|
151 |
//node_iterator tail_node() const nem javasolt
|
marci@9
|
152 |
//node_iterator head_node() const nem javasolt
|
marci@9
|
153 |
|
marci@9
|
154 |
each_edge_iterator metodusai:
|
marci@9
|
155 |
edge_iterator-bol szarmazik
|
marci@9
|
156 |
each_edge_iterator()
|
marci@9
|
157 |
each_edge_iterator& operator++()
|
marci@9
|
158 |
|
marci@9
|
159 |
out_edge_iterator metodusai:
|
marci@9
|
160 |
edge_iterator-bol szarmazik
|
marci@9
|
161 |
out_edge_iterator()
|
marci@9
|
162 |
//out_edge_iterator(const node_iterator&) nem javasolt
|
marci@9
|
163 |
out_edge_iterator& operator++()
|
marci@9
|
164 |
//node_iterator a_node() const nem javasolt
|
marci@9
|
165 |
//node_iterator b_node() const
|
marci@9
|
166 |
|
marci@9
|
167 |
|
marci@9
|
168 |
in_edge_iterator metodusai:
|
marci@9
|
169 |
edge_iterator-bol szarmazik
|
marci@9
|
170 |
in_edge_iterator()
|
marci@9
|
171 |
//in_edge_iterator(const node_iterator&) nem javasolt
|
marci@9
|
172 |
in_edge_iterator& operator++()
|
marci@9
|
173 |
//node_iterator a_node() const nem javasolt
|
marci@9
|
174 |
//node_iterator b_node() const
|
marci@9
|
175 |
|
marci@9
|
176 |
|
marci@9
|
177 |
sym_edge_iterator metodusai:
|
marci@9
|
178 |
edge_iterator-bol szarmazik
|
marci@9
|
179 |
sym_edge_iterator()
|
marci@9
|
180 |
//sym_edge_iterator(const node_iterator&) nem javasolt
|
marci@9
|
181 |
sym_edge_iterator& operator++()
|
marci@9
|
182 |
//node_iterator a_node() const nem javasolt
|
marci@9
|
183 |
//node_iterator b_node() const
|
marci@9
|
184 |
|
marci@9
|
185 |
Node propery array-okrol:
|
marci@9
|
186 |
|
marci@9
|
187 |
template <typename graph_type, typename T>
|
marci@9
|
188 |
class node_property_vector
|
marci@9
|
189 |
|
marci@9
|
190 |
metodusok:
|
marci@9
|
191 |
|
marci@9
|
192 |
node_property_vector(graph_type&)
|
marci@10
|
193 |
node_property_vector(graph_type&, T a)
|
marci@10
|
194 |
fill constructor, a-val kitolt
|
marci@9
|
195 |
void put(graph_traits<graph_type>::node_iterator, const T&)
|
marci@9
|
196 |
T get(graph_traits<graph_type>::node_iterator)
|
marci@9
|
197 |
|
marci@9
|
198 |
Ugyanez edge_property_array-okkal
|
marci@9
|
199 |
|
marci@9
|
200 |
template <typename graph_type, typename T>
|
marci@9
|
201 |
class edge_property_vector
|
marci@9
|
202 |
|
marci@9
|
203 |
edge_property_vector(graph_type&)
|
marci@10
|
204 |
edge_property_vector(graph_type&, T a)
|
marci@10
|
205 |
fill constructor, a-val kitolt
|
marci@9
|
206 |
void put(graph_traits<graph_type>::edge_iterator, const T&)
|
marci@9
|
207 |
get(graph_traits<graph_type>::edge_iterator)
|
marci@9
|
208 |
|
marci@9
|
209 |
Ennyi nem javasolas utan, meg nehany szo.
|
marci@9
|
210 |
Alparral ugy gondoltuk, hogy az iterator 1 olyan egyszeru objetum legyen
|
marci@9
|
211 |
csak, mellyel, ha ervenyes, akkor lehet tovabblepni 1 pont vagy ellistaban.
|
marci@9
|
212 |
Az hogy valamilyen pont-iteratorbeol el-iteratort csinalunk, igenis legyen a
|
marci@9
|
213 |
graf objektum feladata, hiszen igy lehet csinelni ugyanazon a ponthalmazon
|
marci@9
|
214 |
tobb grafot ugyanazon pont-iteratorokkal.
|
marci@9
|
215 |
Sokkal komolyabb kerdesek merultek fel azzal kapcsolatban, hogy hogyan adjuk
|
marci@9
|
216 |
at a propertyket az algoritmusoknak, algoritmus-objektumoknak.
|
marci@9
|
217 |
Errol majd kesobb.
|
marci@9
|
218 |
|
marci@10
|
219 |
marci@cs.elte.hu
|
marci@10
|
220 |
|
marci@10
|
221 |
|
marci@10
|
222 |
|