src/work/marci_graph_concept.txt
author marci
Mon, 12 Jan 2004 11:50:52 +0000
changeset 14 99014d576aed
parent 9 a9ed3f1c2c63
child 15 e41c71268807
permissions -rw-r--r--
reimplemented max_flow algorithm class with bfs_iterator1
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