1
+ #include " CXXGraph/CXXGraph.hpp"
2
+ #include " gtest/gtest.h"
3
+
4
+ TEST (welshPowellColoring, one_edge_two_nodes_undirected) {
5
+ CXXGraph::Node<int > node1 (" 1" , 1 );
6
+ CXXGraph::Node<int > node2 (" 2" , 2 );
7
+
8
+ CXXGraph::UndirectedWeightedEdge<int > edge12 (3 , node1, node2,4 );
9
+
10
+ CXXGraph::T_EdgeSet<int > edgeSet;
11
+ edgeSet.insert (std::make_shared<CXXGraph::UndirectedWeightedEdge<int >>(edge12));
12
+
13
+ CXXGraph::Graph<int > graph (edgeSet);
14
+
15
+ auto result = graph.welshPowellColoring ();
16
+
17
+ // get the highest coloring order
18
+ auto highest_coloring_order = std::max_element (result.begin (), result.end (),
19
+ [](const auto & lhs, const auto & rhs) {
20
+ return lhs.second < rhs.second ;
21
+ }
22
+ )->second ;
23
+ ASSERT_EQ (graph.isUndirectedGraph (), true );
24
+
25
+ // Asserts that the chromatic color of the graph is 2
26
+ ASSERT_EQ (highest_coloring_order, 2 );
27
+ }
28
+
29
+ TEST (welshPowellColoring, undirected_simon_james) {
30
+ // https://www.youtube.com/watch?v=CQIW2mLfG04&ab_channel=SimonJames
31
+ CXXGraph::Node<int > nodeA (" a" , 1 );
32
+ CXXGraph::Node<int > nodeB (" b" , 1 );
33
+ CXXGraph::Node<int > nodeC (" c" , 1 );
34
+ CXXGraph::Node<int > nodeD (" d" , 1 );
35
+ CXXGraph::Node<int > nodeE (" e" , 1 );
36
+ CXXGraph::Node<int > nodeF (" f" , 1 );
37
+ CXXGraph::Node<int > nodeG (" g" , 1 );
38
+ CXXGraph::Node<int > nodeH (" h" , 1 );
39
+ CXXGraph::Node<int > nodeI (" i" , 1 );
40
+ CXXGraph::Node<int > nodeJ (" j" , 1 );
41
+ CXXGraph::Node<int > nodeK (" k" , 1 );
42
+
43
+
44
+ CXXGraph::UndirectedEdge<int > edgeAB (1 , nodeA, nodeB),
45
+ edgeBA (1 , nodeB, nodeA), //
46
+
47
+ edgeAC (1 , nodeA, nodeC),
48
+ edgeCA (1 , nodeC, nodeA), //
49
+
50
+ edgeAD (1 , nodeA, nodeD),
51
+ edgeDA (1 , nodeD, nodeA), //
52
+
53
+ edgeAK (1 , nodeA, nodeK),
54
+ edgeKA (1 , nodeK, nodeA),
55
+
56
+ edgeAH (1 , nodeA, nodeH),
57
+ edgeHA (1 , nodeA, nodeH), //
58
+
59
+ edgeAE (1 , nodeA, nodeE),
60
+ edgeEA (1 , nodeA, nodeH), //
61
+
62
+ edgeAG (1 , nodeA, nodeG),
63
+ edgeGA (1 , nodeA, nodeG), //
64
+
65
+ edgeBK (1 , nodeB, nodeK),
66
+ edgeKB (1 , nodeK, nodeB), //
67
+
68
+ edgeBI (1 , nodeB, nodeI),
69
+ edgeIB (1 , nodeI, nodeB), //
70
+
71
+ edgeBJ (1 , nodeB, nodeJ),
72
+ edgeJB (1 , nodeJ, nodeB),
73
+
74
+ edgeBF (1 , nodeB, nodeF),
75
+ edgeFB (1 , nodeF, nodeB), //
76
+
77
+ edgeBD (1 , nodeB, nodeD),
78
+ edgeDB (1 , nodeD, nodeB), //
79
+
80
+ edgeCE (1 , nodeC, nodeE),
81
+ edgeEC (1 , nodeE, nodeC), //
82
+
83
+ edgeCD (1 , nodeC, nodeD),
84
+ edgeDC (1 , nodeD, nodeC), //
85
+
86
+ edgeCH (1 , nodeC, nodeH),
87
+ edgeHC (1 , nodeH, nodeC), //
88
+
89
+ edgeCG (1 , nodeC, nodeG),
90
+ edgeGC (1 , nodeG, nodeC), //
91
+
92
+ edgeDE (1 , nodeD, nodeE),
93
+ edgeED (1 , nodeD, nodeE), //
94
+
95
+ edgeEK (1 , nodeE, nodeK),
96
+ edgeKE (1 , nodeK, nodeE), //
97
+
98
+ edgeFI (1 , nodeF, nodeI),
99
+ edgeIF (1 , nodeI, nodeF),
100
+
101
+ edgeFJ (1 , nodeF, nodeJ),
102
+ edgeJF (1 , nodeJ, nodeF),
103
+
104
+ edgeFG (1 , nodeF, nodeG),
105
+ edgeGF (1 , nodeG, nodeF),
106
+
107
+ edgeGH (1 , nodeG, nodeH),
108
+ edgeHG (1 , nodeH, nodeG),
109
+
110
+ edgeIJ (1 , nodeI, nodeJ), //
111
+ edgeJI (1 , nodeJ, nodeI); //
112
+
113
+ CXXGraph::T_EdgeSet<int > edgeSet;
114
+
115
+ edgeSet.insert (std::make_shared<CXXGraph::UndirectedEdge<int >>(edgeAB));
116
+
117
+ edgeSet.insert (std::make_shared<CXXGraph::UndirectedEdge<int >>(edgeAC));
118
+
119
+ edgeSet.insert (std::make_shared<CXXGraph::UndirectedEdge<int >>(edgeAD));
120
+
121
+ edgeSet.insert (std::make_shared<CXXGraph::UndirectedEdge<int >>(edgeAK));
122
+
123
+ edgeSet.insert (std::make_shared<CXXGraph::UndirectedEdge<int >>(edgeAH));
124
+
125
+ edgeSet.insert (std::make_shared<CXXGraph::UndirectedEdge<int >>(edgeAE));
126
+
127
+ edgeSet.insert (std::make_shared<CXXGraph::UndirectedEdge<int >>(edgeAG));
128
+
129
+ edgeSet.insert (std::make_shared<CXXGraph::UndirectedEdge<int >>(edgeBK));
130
+
131
+ edgeSet.insert (std::make_shared<CXXGraph::UndirectedEdge<int >>(edgeBI));
132
+
133
+ edgeSet.insert (std::make_shared<CXXGraph::UndirectedEdge<int >>(edgeBJ));
134
+
135
+ edgeSet.insert (std::make_shared<CXXGraph::UndirectedEdge<int >>(edgeBF));
136
+
137
+ edgeSet.insert (std::make_shared<CXXGraph::UndirectedEdge<int >>(edgeBD));
138
+
139
+ edgeSet.insert (std::make_shared<CXXGraph::UndirectedEdge<int >>(edgeCE));
140
+
141
+ edgeSet.insert (std::make_shared<CXXGraph::UndirectedEdge<int >>(edgeCD));
142
+
143
+ edgeSet.insert (std::make_shared<CXXGraph::UndirectedEdge<int >>(edgeCH));
144
+
145
+ edgeSet.insert (std::make_shared<CXXGraph::UndirectedEdge<int >>(edgeCG));
146
+
147
+ edgeSet.insert (std::make_shared<CXXGraph::UndirectedEdge<int >>(edgeDE));
148
+
149
+ edgeSet.insert (std::make_shared<CXXGraph::UndirectedEdge<int >>(edgeEK));
150
+
151
+ edgeSet.insert (std::make_shared<CXXGraph::UndirectedEdge<int >>(edgeFI));
152
+
153
+ edgeSet.insert (std::make_shared<CXXGraph::UndirectedEdge<int >>(edgeFJ));
154
+
155
+ edgeSet.insert (std::make_shared<CXXGraph::UndirectedEdge<int >>(edgeFG));
156
+
157
+ edgeSet.insert (std::make_shared<CXXGraph::UndirectedEdge<int >>(edgeGH));
158
+
159
+ edgeSet.insert (std::make_shared<CXXGraph::UndirectedEdge<int >>(edgeIJ));
160
+
161
+
162
+ CXXGraph::Graph<int > graph (edgeSet);
163
+
164
+ auto result = graph.welshPowellColoring ();
165
+ auto highest_coloring_order = std::max_element (result.begin (), result.end (),
166
+ [](const auto & lhs, const auto & rhs) {
167
+ return lhs.second < rhs.second ;
168
+ }
169
+ )->second ;
170
+
171
+ ASSERT_EQ (graph.isUndirectedGraph (), true );
172
+ // Asserts that the chromatic color of the graph is 4, as indicated in 2:30 of video
173
+ ASSERT_EQ (highest_coloring_order, 4 );
174
+ }
0 commit comments