src/work/marci_graph_concept.txt
author marci
Thu, 22 Jan 2004 17:04:38 +0000
changeset 31 d93bef0c4ed3
parent 19 3151a1026db9
child 40 ffaa9448964c
permissions -rw-r--r--
c++
marci@9
     1
ETIK-OL-NOLIB-NEGRES graph concept-ek.
marci@9
     2
jacint@30
     3
 Ebben a dokumentacioban graph concept tervek es azok megvalositasarol irok. 
marci@9
     4
A felsorolt rutinok, osztalyok egyaltalan nem kikristalyosodottak, 1-1 elemi 
jacint@30
     5
operacio elvegzesere 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_list_graph.hh  //list_graph megvalositas
marci@9
    20
marci_max_flow.hh     //folyam, kiserleti
marci@9
    21
marci_property_vector.hh //property vector megvalosites indexelt grafokhoz	
marci@9
    22
graf es iterator tipusok:
marci@9
    23
marci@15
    24
class list_graph;	 
marci@9
    25
marci@15
    26
class node_iterator;      
marci@9
    27
trivialis node iterator, csak cimezni lehet vele, pl property vectort
marci@9
    28
jacint@30
    29
<<<<<<< marci_graph_concept.txt
jacint@30
    30
class each_node_iterator
jacint@30
    31
node iterator a graf pontjainak bejarasara, node_iterator-ra konvertalhato
jacint@30
    32
=======
marci@15
    33
class each_node_iterator;
marci@9
    34
node iterator a graf pontjainak bejarasara, node_iterator-a konvertalhato
jacint@30
    35
>>>>>>> 1.3
marci@9
    36
marci@15
    37
class edge_iterator;
marci@9
    38
trivialis edge iterator, csak cimezni lehet vele, pl property vectort
marci@9
    39
marci@15
    40
class each_edge_iterator;
marci@9
    41
edge iterator a graf osszes elenek bejarasara
marci@9
    42
jacint@30
    43
<<<<<<< marci_graph_concept.txt
jacint@30
    44
class out_edge_iterator
jacint@30
    45
edge iterator 1 pont ki eleinek bejarasara, edge_iterator-ra konvertalhato
jacint@30
    46
=======
marci@15
    47
class out_edge_iterator;
marci@9
    48
edge iterator 1 pont ki eleinek bejarasara, edge_iterator-a konvertalhato
jacint@30
    49
>>>>>>> 1.3
marci@9
    50
jacint@30
    51
<<<<<<< marci_graph_concept.txt
jacint@30
    52
class in_edge_iterator
jacint@30
    53
edge iterator 1 pont be eleinek bejarasara, edge_iterator-ra konvertalhato
jacint@30
    54
=======
marci@15
    55
class in_edge_iterator;
marci@9
    56
edge iterator 1 pont be eleinek bejarasara, edge_iterator-a konvertalhato
jacint@30
    57
>>>>>>> 1.3
marci@9
    58
      
jacint@30
    59
<<<<<<< marci_graph_concept.txt
jacint@30
    60
class sym_edge_iterator
jacint@30
    61
edge iterator 1 pont be es ki eleinek bejarasara, edge_iterator-ra
jacint@30
    62
konvertalhato 
jacint@30
    63
=======
marci@15
    64
class sym_edge_iterator;
marci@9
    65
edge iterator 1 pont be es ki eleinek bejarasara, edge_iterator-a konvertalhato
jacint@30
    66
>>>>>>> 1.3
marci@9
    67
marci@9
    68
default constructor:
marci@9
    69
marci@15
    70
list_graph();
marci@9
    71
    
marci@9
    72
A graf osztaly fobb publikus metodusai, az alapveto hasznalathoz:
marci@9
    73
Hasonlo funkciok megvalosithatok 1 kesobb leirt modon, illetve 
marci@9
    74
ezek kozul nehany az iteratorok metodusaival, megis azt javasolnam, hogy az 
marci@9
    75
iteratorok metodusait ne hasznaljuk. Miert? Azt  szeretnenk, ha 1 ponthalmazon 
marci@9
    76
van 2 graf, es csak az elhalmazhoz keszitunk uj iteratorokat, akkor pl 1 pont 
marci@9
    77
out-edge-iteratora megkaphato legyen a grafbol es a node_iteratorbol. Ezert 
marci@9
    78
out_edge_iterator(const node_iterator&) hasznalata nem javasolt, 
marci@9
    79
esetleg majd szamuzzuk a concept-bol, s akkor nem nesz baj. 
marci@9
    80
marci@15
    81
each_node_iterator first_node();
marci@15
    82
each_edge_iterator first_edge();
marci@15
    83
out_edge_iterator first_out_edge(const node_iterator&);
marci@15
    84
in_edge_iterator first_in_edge(const node_iterator&);
marci@15
    85
sym_edge_iterator first_sym_edge(const node_iterator&);
marci@9
    86
marci@15
    87
node_iterator tail(const edge_iterator&);
marci@15
    88
node_iterator head(const edge_iterator&);
marci@9
    89
marci@15
    90
node_iterator a_node(const out_edge_iterator&);
marci@15
    91
node_iterator a_node(const in_edge_iterator&);
marci@15
    92
node_iterator a_node(const sym_edge_iterator&);
marci@9
    93
//az out, in or sym edge iterator rogzitett pontjara ad 1 node_iterator-t
marci@9
    94
marci@15
    95
node_iterator b_node(const out_edge_iterator&);
marci@15
    96
node_iterator b_node(const in_edge_iterator&);
marci@15
    97
node_iterator b_node(const sym_edge_iterator&);
marci@9
    98
//az out, in or sym edge iterator nem rogzitett pontjara ad 1 node_iterator-t
marci@9
    99
marci@15
   100
//node_iterator invalid_node();
marci@15
   101
//edge_iterator invalid_edge();
marci@15
   102
//out_edge_iterator invalid_out_edge();
marci@15
   103
//in_edge_iterator invalid_in_edge();
marci@15
   104
//sym_edge_iterator invalid_sym_edge();
marci@9
   105
marci@9
   106
//az iteratorok ures konstruktorai meghatarozatlan 
marci@9
   107
tartalmu konstruktort adnak vissza, ezekkel a matodusokkal 
marci@9
   108
lehet ervenytelent csinalni.
marci@9
   109
Lehet hogy ezt az ures konstruktorral kellene, tessek vitatkozni.
marci@9
   110
marci@9
   111
Kiserleti cellal ugyanezen fv-ek mas stilusu megvalositasai:
marci@9
   112
marci@15
   113
void get_first(each_node_iterator&);
marci@15
   114
void get_first(each_edge_iterator&);
marci@15
   115
void get_first(out_edge_iterator&, const node_iterator&);
marci@15
   116
void get_first(in_edge_iterator&, const node_iterator&);
marci@15
   117
void get_first(sym_edge_iterator&, const node_iterator&);
marci@9
   118
marci@15
   119
void get_tail(node_iterator&, const edge_iterator&);
marci@15
   120
void get_head(node_iterator&, const edge_iterator&);
marci@9
   121
marci@15
   122
void get_a_node(node_iterator&, const out_edge_iterator&);
marci@15
   123
void get_a_node(node_iterator&, const in_edge_iterator&);
marci@15
   124
void get_a_node(node_iterator&, const sym_edge_iterator&);
marci@9
   125
   
marci@15
   126
void get_b_node(node_iterator&, const out_edge_iterator&);
marci@15
   127
void get_b_node(node_iterator&, const in_edge_iterator&);
marci@15
   128
void get_b_node(node_iterator&, const sym_edge_iterator&);
marci@9
   129
 
marci@15
   130
//void get_invalid(node_iterator&);
marci@15
   131
//void get_invalid(edge_iterator&);
marci@15
   132
//void get_invalid(out_edge_iterator&);
marci@15
   133
//void get_invalid(in_edge_iterator&);
marci@15
   134
//void get_invalid(sym_edge_iterator&);
marci@9
   135
 
marci@9
   136
Pontok azonositasara de meginkabb property vectorokhoz:
marci@9
   137
marci@15
   138
int id(const node_iterator&);
marci@15
   139
int id(const edge_iterator&);
marci@9
   140
marci@9
   141
Pontok es elek hozzaadasanak metodusai:
marci@9
   142
marci@15
   143
node_iterator add_node();
marci@15
   144
edge_iterator add_edge(const node_iterator&, const node_iterator&);
marci@9
   145
marci@9
   146
Hogy konnyebb legyen a progikat tesztelni, nehany stream utasitas:
marci@9
   147
ezek nem a list_graph metodusai
marci@9
   148
marci@15
   149
friend std::ostream& operator<<(std::ostream&, const node_iterator&);
marci@15
   150
friend std::ostream& operator<<(std::ostream&, const edge_iterator&);
marci@9
   151
marci@9
   152
node_iterator metodusai:
marci@15
   153
node_iterator();
marci@19
   154
bool valid();
marci@15
   155
void make_invalid();
marci@9
   156
ezek nem tagfuggvenyek:
marci@15
   157
friend bool operator==(const node_iterator&, const node_iterator&);
marci@15
   158
friend bool operator!=(const node_iterator& u, const node_iterator& v);
marci@9
   159
    
marci@9
   160
each_node_iterator metodusai:
marci@9
   161
ez publikusan szarmazik a node_iterator-bol, tehat a fentiek is.
marci@15
   162
each_node_iterator();
marci@15
   163
each_node_iterator& operator++();
marci@9
   164
marci@9
   165
edge_iterator metodusai:
marci@15
   166
edge_iterator();
marci@19
   167
bool valid();
marci@15
   168
void make_invalid();
marci@9
   169
ezek nem tagfvek:
marci@15
   170
friend bool operator==(const edge_iterator&, const edge_iterator&);
marci@15
   171
friend bool operator!=(const edge_iterator&, const edge_iterator&);
marci@9
   172
ujra tagfv-ek.
marci@15
   173
//node_iterator tail_node() const;		nem javasolt
marci@15
   174
//node_iterator head_node() const;		nem javasolt
marci@9
   175
   
marci@9
   176
each_edge_iterator metodusai:
marci@9
   177
edge_iterator-bol szarmazik
marci@15
   178
each_edge_iterator();
marci@15
   179
each_edge_iterator& operator++();
marci@9
   180
 
marci@9
   181
out_edge_iterator metodusai:
marci@9
   182
edge_iterator-bol szarmazik
marci@15
   183
out_edge_iterator();
marci@15
   184
//out_edge_iterator(const node_iterator&);	nem javasolt
marci@15
   185
out_edge_iterator& operator++();
marci@15
   186
//node_iterator a_node() const;		nem javasolt
marci@15
   187
//node_iterator b_node() const; 
marci@9
   188
    
marci@9
   189
 
marci@9
   190
in_edge_iterator metodusai: 
marci@9
   191
edge_iterator-bol szarmazik
marci@15
   192
in_edge_iterator();
marci@15
   193
//in_edge_iterator(const node_iterator&);	nem javasolt
marci@15
   194
in_edge_iterator& operator++();
marci@15
   195
//node_iterator a_node() const;		nem javasolt
marci@15
   196
//node_iterator b_node() const; 
marci@9
   197
marci@9
   198
marci@9
   199
sym_edge_iterator metodusai:
marci@9
   200
edge_iterator-bol szarmazik
marci@15
   201
sym_edge_iterator();
marci@15
   202
//sym_edge_iterator(const node_iterator&);	nem javasolt
marci@15
   203
sym_edge_iterator& operator++();
marci@15
   204
//node_iterator a_node() const;		nem javasolt
marci@15
   205
//node_iterator b_node() const; 
marci@9
   206
		
marci@9
   207
Node propery array-okrol:
marci@9
   208
marci@9
   209
template <typename graph_type, typename T>
marci@15
   210
class node_property_vector; 
marci@9
   211
marci@9
   212
metodusok:
marci@9
   213
marci@15
   214
node_property_vector(graph_type&);
marci@19
   215
void put(graph_type::node_iterator, const T&);
marci@19
   216
T get(graph_type::node_iterator);
marci@9
   217
marci@9
   218
Ugyanez edge_property_array-okkal
marci@9
   219
marci@9
   220
template <typename graph_type, typename T>
marci@15
   221
class edge_property_vector;
marci@9
   222
marci@15
   223
edge_property_vector(graph_type&);
marci@19
   224
void put(graph_type::edge_iterator, const T&);
marci@19
   225
get(graph_type::edge_iterator);
marci@9
   226
marci@9
   227
 Ennyi nem javasolas utan, meg nehany szo.
marci@9
   228
 Alparral ugy gondoltuk, hogy az iterator 1 olyan egyszeru objetum legyen 
marci@9
   229
csak, mellyel, ha ervenyes, akkor lehet tovabblepni 1 pont vagy ellistaban. 
marci@9
   230
Az hogy valamilyen pont-iteratorbeol el-iteratort csinalunk, igenis legyen a 
marci@9
   231
graf objektum feladata, hiszen igy lehet csinelni ugyanazon a ponthalmazon
marci@9
   232
tobb grafot ugyanazon pont-iteratorokkal.
marci@9
   233
 Sokkal komolyabb kerdesek merultek fel azzal kapcsolatban, hogy hogyan adjuk 
marci@9
   234
at a propertyket az algoritmusoknak, algoritmus-objektumoknak. 
marci@9
   235
Errol majd kesobb.
marci@9
   236
marci@15
   237
marci@cs.elte.hu