A bipartite graph template can be used as BipartiteGraph<ListGraph>.
4 esetleg az elejen moho matching kereses
6 //baj van pos-sal: nem tudok vegigmaszni a halmazok elemein. De
7 //pos-ra nem lenne szukseg ha unionfindban lenne egy element ami
8 //true ha benne van false ha nincs
10 MISI strukijahoz hasznalok:
12 void addElement(b,a): b meg nem volt egy osztalyban sem, ezzel hozzaadjuk a osztalyahoz
13 void insert(a): a meg nem volt egy osztalyban sem, ezzel egy uj egyelemu osztalyt alkot
14 bool element(a): true ha benne van false ha nincs
17 ez a 4 a vegso szetrobbantashoz es egyideju elemfelsorolashoz kell, mas megoldas is jo ehelyett:
19 bool empty(int i): ures-e az i nevu osztaly
21 void pop(int i): egy fix elso elemet kitorol az i osztalybol
22 T top(int i): visszad egy fix elso elemet
25 bool element(a): true ha benne van false ha nincs (vagy 'bool empty')
26 void split(a) (vagy clear)
27 T rep(a): visszaadja a halmazanak reprezentanselemet, lehet operator()-val is
28 void makeRep(a): a-t a sajat halmazanak reprezentansava teszi
30 Szoljatok ha nem lehet valamelyiket hatekonyan
33 #ifndef HUGO_EDMONDS_H
34 #define HUGO_EDMONDS_H
39 #include <unionfind.h>
43 template <typename Graph>
46 typedef typename Graph::Node Node;
47 typedef typename Graph::Edge Edge;
48 typedef typename Graph::EdgeIt EdgeIt;
49 typedef typename Graph::NodeIt NodeIt;
50 typedef typename Graph::OutEdgeIt OutEdgeIt;
52 typedef UnionFindEnum<Node, Graph::NodeMap > ufe;
57 Edmonds(Graph& _G) : G(_G) {}
60 int run(std::vector<Edge> matching) {
67 Graph::template NodeMap<pos_enum> pos(G,C);
69 int p=0; //needed for path
71 typename Graph::NodeMap<Node> mate(G,INVALID);
72 for ( int i=0; i!=matching.size(); ++i ) {
73 Node u=G.aNode(matching[i]);
74 Node v=G.bNode(matching[i]);
80 typename Graph::NodeMap<Node> ear(G,INVALID);
81 // a basepontok es a C-beliek earje szemet
83 ufe::MapType blossom_base(G);
84 ufe blossom(blossom_base);
85 ufe::MapType tree_base(G);
89 for(G.first(v); G.valid(v), G.next(v) ) {
91 if ( pos[v]==C && mate[v]=INVALID ) {
97 std::queue<Node> Q; //a vizsgalando csucsok sora
100 while ( !Q.empty() ) {
105 for( G.first(e); G.valid(e), G.next(e) ) {
110 if ( tree.find(x) != tree.find(y) ) { //augment
111 augment(x, mate, ear, blossom, tree);
112 augment(y, mate, ear, blossom, tree);
117 if ( blossom.find(x) != blossom.find(y) ) {
119 typename Graph::NodeMap<int> path(G,0);
122 Node b=blossom.find(x);
124 while ( b!=INVALID ) {
125 b=blossom.find(ear[mate[b]]);
127 } //going till the root
130 Node v=blossom.find(w);
131 while ( path[v]!=p ) {
133 w=shrink_step(w,v,mate,ear,tree,blossom);
136 //now v is the base of the first common ancestor
139 Node z=blossom.find(w);
142 w=shrink_step(w,z,mate,ear,tree,blossom);
151 } else if ( pos[y] == C )
153 if ( mate[y]!=INVALID ) { //grow
162 augment(x, mate, ear, blossom, tree);
169 increased: //Misi, warningol, hogy nincs utasitas!
175 for(G.first(v); G.valid(v), G.next(v) )
176 if ( mate[v]!=INVALID ) ++s;
180 //egyelore nem ad semmit vissza
185 void augment(const Node x, typename Graph::NodeMap<Node>& mate,
186 typename Graph::NodeMap<Node>& ear,
187 ufe& blossom, ufe& tree) {
189 while ( v!=INVALID ) {
196 //FIXME, blossom szetszed
201 Node shrink_step(const Node z, const Node v, typename Graph::NodeMap<Node>& mate,
202 typename Graph::NodeMap<Node>& ear,
203 ufe& blossom, ufe& tree) {