Algorithms Library Toolkit
A toolkit for algorithms, especially for algorithms on formal languages
WeightedGraphClasses.hpp
Go to the documentation of this file.
1
6// Copyright (c) 2017 Czech Technical University in Prague | Faculty of Information Technology. All rights reserved.
7
8#pragma once
9
10#include <common/Normalize.hpp>
13
20
21namespace graph {
22
23// ---------------------------------------------------------------------------------------------------------------------
24
25template<typename TNode = DefaultNodeType, typename TEdge = DefaultWeightedEdgeType>
26class WeightedUndirectedGraph : public UndirectedGraph<TNode, TEdge> {
27 public:
28 using node_type = TNode;
29 using edge_type = TEdge;
30};
31
32// ---------------------------------------------------------------------------------------------------------------------
33
34template<typename TNode = DefaultNodeType, typename TEdge = DefaultWeightedEdgeType>
36 public:
37 using node_type = TNode;
38 using edge_type = TEdge;
39};
40
41// ---------------------------------------------------------------------------------------------------------------------
42
43template<typename TNode = DefaultNodeType, typename TEdge = DefaultWeightedEdgeType>
44class WeightedDirectedGraph : public DirectedGraph<TNode, TEdge> {
45 public:
46 using node_type = TNode;
47 using edge_type = TEdge;
48};
49
50// ---------------------------------------------------------------------------------------------------------------------
51
52template<typename TNode = DefaultNodeType, typename TEdge = DefaultWeightedEdgeType>
53class WeightedDirectedMultiGraph : public DirectedMultiGraph<TNode, TEdge> {
54 public:
55 using node_type = TNode;
56 using edge_type = TEdge;
57};
58
59// ---------------------------------------------------------------------------------------------------------------------
60
61template<typename TNode = DefaultNodeType, typename TEdge = DefaultWeightedEdgeType>
62class WeightedMixedGraph : public MixedGraph<TNode, TEdge> {
63 public:
64 using node_type = TNode;
65 using edge_type = TEdge;
66};
67
68// ---------------------------------------------------------------------------------------------------------------------
69
70template<typename TNode = DefaultNodeType, typename TEdge = DefaultWeightedEdgeType>
71class WeightedMixedMultiGraph : public MixedMultiGraph<TNode, TEdge> {
72 public:
73 using node_type = TNode;
74 using edge_type = TEdge;
75};
76
77// ---------------------------------------------------------------------------------------------------------------------
78}
79
80// =====================================================================================================================
81
82namespace core {
83
90template<typename TNode, typename TEdge>
91struct normalize < graph::WeightedUndirectedGraph < TNode, TEdge > > {
94
95 for (auto &&i: value.getAdjacencyList()) {
97 for (auto &&j: i.second) {
100
101 graph.addNode(first);
102 graph.addNode(second);
103 graph.addEdge(edge);
104 }
105 }
106
107 return graph;
108 }
109};
110
111// ---------------------------------------------------------------------------------------------------------------------
112
119template<typename TNode, typename TEdge>
120struct normalize < graph::WeightedUndirectedMultiGraph < TNode, TEdge > > {
123
124 for (auto &&i: value.getAdjacencyList()) {
126 for (auto &&j: i.second) {
129
130 graph.addNode(first);
131 graph.addNode(second);
132 graph.addEdge(edge);
133 }
134 }
135
136 return graph;
137 }
138};
139
140// ---------------------------------------------------------------------------------------------------------------------
141
148template<typename TNode, typename TEdge>
149struct normalize < graph::WeightedDirectedGraph < TNode, TEdge > > {
152
153 // Create successor
154 for (auto &&i: value.getSuccessorList()) {
156 for (auto &&j: i.second) {
159
160 graph.addNode(first);
161 graph.addNode(second);
162 graph.addEdge(edge);
163 }
164 }
165
166 // Create predecessors
167 for (auto &&i: value.getPredecessorList()) {
169 for (auto &&j: i.second) {
172
173 graph.addNode(first);
174 graph.addNode(second);
175 graph.addEdge(edge);
176 }
177 }
178
179 return graph;
180 }
181};
182// ---------------------------------------------------------------------------------------------------------------------
183
190template<typename TNode, typename TEdge>
191struct normalize < graph::WeightedDirectedMultiGraph < TNode, TEdge > > {
194
195 // Create successor
196 for (auto &&i: value.getSuccessorList()) {
198 for (auto &&j: i.second) {
201
202 graph.addNode(first);
203 graph.addNode(second);
204 graph.addEdge(edge);
205 }
206 }
207
208 // Create predecessors
209 for (auto &&i: value.getPredecessorList()) {
211 for (auto &&j: i.second) {
214
215 graph.addNode(first);
216 graph.addNode(second);
217 graph.addEdge(edge);
218 }
219 }
220
221 return graph;
222 }
223};
224
225// ---------------------------------------------------------------------------------------------------------------------
226
233template<typename TNode, typename TEdge>
234struct normalize < graph::WeightedMixedGraph < TNode, TEdge > > {
237
238 // Create edges
239 for (auto &&i: value.getAdjacencyList()) {
241 for (auto &&j: i.second) {
244
245 graph.addNode(first);
246 graph.addNode(second);
247 graph.addEdge(edge);
248 }
249 }
250
251 // Create successor
252 for (auto &&i: value.getSuccessorList()) {
254 for (auto &&j: i.second) {
257
258 graph.addNode(first);
259 graph.addNode(second);
260 graph.addEdge(edge);
261 }
262 }
263
264 // Create predecessors
265 for (auto &&i: value.getPredecessorList()) {
267 for (auto &&j: i.second) {
270
271 graph.addNode(first);
272 graph.addNode(second);
273 graph.addEdge(edge);
274 }
275 }
276
277 return graph;
278 }
279};
280
281// ---------------------------------------------------------------------------------------------------------------------
282
289template<typename TNode, typename TEdge>
290struct normalize < graph::WeightedMixedMultiGraph < TNode, TEdge > > {
293
294 // Create edges
295 for (auto &&i: value.getAdjacencyList()) {
297 for (auto &&j: i.second) {
300
301 graph.addNode(first);
302 graph.addNode(second);
303 graph.addEdge(edge);
304 }
305 }
306
307 // Create successor
308 for (auto &&i: value.getSuccessorList()) {
310 for (auto &&j: i.second) {
313
314 graph.addNode(first);
315 graph.addNode(second);
316 graph.addEdge(edge);
317 }
318 }
319
320 // Create predecessors
321 for (auto &&i: value.getPredecessorList()) {
323 for (auto &&j: i.second) {
326
327 graph.addNode(first);
328 graph.addNode(second);
329 graph.addEdge(edge);
330 }
331 }
332
333 return graph;
334 }
335};
336
337// ---------------------------------------------------------------------------------------------------------------------
338
339}
340
341// =====================================================================================================================
Definition: WeightedEdge.hpp:21
Class extending the pair class from the standard library. Original reason is to allow printing of the...
Definition: pair.hpp:43
Definition: DirectedGraph.hpp:26
Definition: DirectedMultiGraph.hpp:26
TEdge edge_type
Definition: GraphInterface.hpp:23
TNode node_type
Definition: GraphInterface.hpp:22
static DefaultNodeType normalizeNode(TNode &&node)
Definition: Normalize.hpp:47
static DefaultWeightedEdgeType normalizeWeightedEdge(TEdge &&edge)
Definition: Normalize.hpp:59
Definition: MixedGraph.hpp:26
Definition: MixedMultiGraph.hpp:26
Definition: UndirectedGraph.hpp:26
Definition: UndirectedMultiGraph.hpp:26
Definition: WeightedGraphClasses.hpp:44
Definition: WeightedGraphClasses.hpp:53
Definition: WeightedGraphClasses.hpp:62
Definition: WeightedGraphClasses.hpp:71
Definition: WeightedGraphClasses.hpp:26
Definition: WeightedGraphClasses.hpp:35
Definition: Object.h:16
p second
Definition: ToRegExpAlgebraic.h:126
int i
Definition: AllEpsilonClosure.h:118
Definition: normalize.hpp:10
Definition: CapacityEdge.hpp:18
Definition: ReconstructPath.hpp:14
static graph::WeightedDirectedGraph eval(graph::WeightedDirectedGraph< TNode, TEdge > &&value)
Definition: WeightedGraphClasses.hpp:150
static graph::WeightedDirectedMultiGraph eval(graph::WeightedDirectedMultiGraph< TNode, TEdge > &&value)
Definition: WeightedGraphClasses.hpp:192
static graph::WeightedMixedGraph eval(graph::WeightedMixedGraph< TNode, TEdge > &&value)
Definition: WeightedGraphClasses.hpp:235
static graph::WeightedMixedMultiGraph eval(graph::WeightedMixedMultiGraph< TNode, TEdge > &&value)
Definition: WeightedGraphClasses.hpp:291
static graph::WeightedUndirectedGraph eval(graph::WeightedUndirectedGraph< TNode, TEdge > &&value)
Definition: WeightedGraphClasses.hpp:92
static graph::WeightedUndirectedMultiGraph eval(graph::WeightedUndirectedMultiGraph< TNode, TEdge > &&value)
Definition: WeightedGraphClasses.hpp:121
Definition: normalize.hpp:13