public static void Sort(this GeometricGraph graph, int n) { if (graph.VertexCount <= 0U) { return; } QuickSort.Sort((Func <long, long>)(vertex => graph.Distance(n, (uint)vertex)), (Action <long, long>)((vertex1, vertex2) => { if (vertex1 == vertex2) { return; } graph.Switch((uint)vertex1, (uint)vertex2); }), 0L, (long)(graph.VertexCount - 1U)); }
public void TestSwitch() { var graph = new GeometricGraph(1, 100); graph.AddVertex(0, 0, 0); graph.AddVertex(1, 0, 0); graph.AddEdge(0, 1, new uint[] { 1 }, null); graph.Switch(0, 1); // verify all edges. var edges = graph.GetEdgeEnumerator(0); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(1, edges.First().To); Assert.AreEqual(true, edges.First().DataInverted); Assert.AreEqual(1, edges.First().Data[0]); edges = graph.GetEdgeEnumerator(1); Assert.AreEqual(1, edges.Count()); Assert.AreEqual(0, edges.First().To); Assert.AreEqual(1, edges.First().Data[0]); graph = new GeometricGraph(1, 100); graph.AddVertex(0, 0, 0); graph.AddVertex(1, 0, 0); graph.AddVertex(2, 0, 0); graph.AddVertex(3, 0, 0); graph.AddVertex(4, 0, 0); graph.AddVertex(5, 0, 0); graph.AddEdge(0, 1, new uint[] { 1 }, null); graph.AddEdge(0, 2, new uint[] { 2 }, null); graph.AddEdge(0, 3, new uint[] { 3 }, null); graph.AddEdge(0, 4, new uint[] { 4 }, null); graph.AddEdge(5, 1, new uint[] { 5 }, null); graph.AddEdge(5, 2, new uint[] { 6 }, null); graph.AddEdge(5, 3, new uint[] { 7 }, null); graph.AddEdge(5, 4, new uint[] { 8 }, null); graph.Switch(0, 1); // verify all edges. edges = graph.GetEdgeEnumerator(0); Assert.AreEqual(2, edges.Count()); Assert.AreEqual(true, edges.First(x => x.To == 1).DataInverted); Assert.AreEqual(1, edges.First(x => x.To == 1).Data[0]); Assert.AreEqual(true, edges.First(x => x.To == 5).DataInverted); Assert.AreEqual(5, edges.First(x => x.To == 5).Data[0]); edges = graph.GetEdgeEnumerator(1); Assert.AreEqual(4, edges.Count()); Assert.AreEqual(1, edges.First(x => x.To == 0).Data[0]); Assert.AreEqual(2, edges.First(x => x.To == 2).Data[0]); Assert.AreEqual(3, edges.First(x => x.To == 3).Data[0]); Assert.AreEqual(4, edges.First(x => x.To == 4).Data[0]); edges = graph.GetEdgeEnumerator(2); Assert.AreEqual(2, edges.Count()); Assert.AreEqual(true, edges.First(x => x.To == 1).DataInverted); Assert.AreEqual(2, edges.First(x => x.To == 1).Data[0]); Assert.AreEqual(true, edges.First(x => x.To == 5).DataInverted); Assert.AreEqual(6, edges.First(x => x.To == 5).Data[0]); edges = graph.GetEdgeEnumerator(3); Assert.AreEqual(2, edges.Count()); Assert.AreEqual(true, edges.First(x => x.To == 1).DataInverted); Assert.AreEqual(3, edges.First(x => x.To == 1).Data[0]); Assert.AreEqual(true, edges.First(x => x.To == 5).DataInverted); Assert.AreEqual(7, edges.First(x => x.To == 5).Data[0]); edges = graph.GetEdgeEnumerator(4); Assert.AreEqual(2, edges.Count()); Assert.AreEqual(true, edges.First(x => x.To == 1).DataInverted); Assert.AreEqual(4, edges.First(x => x.To == 1).Data[0]); Assert.AreEqual(true, edges.First(x => x.To == 5).DataInverted); Assert.AreEqual(8, edges.First(x => x.To == 5).Data[0]); graph.Switch(0, 1); // verify all edges. edges = graph.GetEdgeEnumerator(0); Assert.AreEqual(4, edges.Count()); Assert.AreEqual(1, edges.First(x => x.To == 1).Data[0]); Assert.AreEqual(2, edges.First(x => x.To == 2).Data[0]); Assert.AreEqual(3, edges.First(x => x.To == 3).Data[0]); Assert.AreEqual(4, edges.First(x => x.To == 4).Data[0]); edges = graph.GetEdgeEnumerator(1); Assert.AreEqual(2, edges.Count()); Assert.AreEqual(true, edges.First(x => x.To == 0).DataInverted); Assert.AreEqual(1, edges.First(x => x.To == 0).Data[0]); Assert.AreEqual(true, edges.First(x => x.To == 5).DataInverted); Assert.AreEqual(5, edges.First(x => x.To == 5).Data[0]); edges = graph.GetEdgeEnumerator(2); Assert.AreEqual(2, edges.Count()); Assert.AreEqual(true, edges.First(x => x.To == 0).DataInverted); Assert.AreEqual(2, edges.First(x => x.To == 0).Data[0]); Assert.AreEqual(true, edges.First(x => x.To == 5).DataInverted); Assert.AreEqual(6, edges.First(x => x.To == 5).Data[0]); edges = graph.GetEdgeEnumerator(3); Assert.AreEqual(2, edges.Count()); Assert.AreEqual(true, edges.First(x => x.To == 0).DataInverted); Assert.AreEqual(3, edges.First(x => x.To == 0).Data[0]); Assert.AreEqual(true, edges.First(x => x.To == 5).DataInverted); Assert.AreEqual(7, edges.First(x => x.To == 5).Data[0]); edges = graph.GetEdgeEnumerator(4); Assert.AreEqual(2, edges.Count()); Assert.AreEqual(true, edges.First(x => x.To == 0).DataInverted); Assert.AreEqual(4, edges.First(x => x.To == 0).Data[0]); Assert.AreEqual(true, edges.First(x => x.To == 5).DataInverted); Assert.AreEqual(8, edges.First(x => x.To == 5).Data[0]); }
/// <summary> /// Switches the two vertices. /// </summary> public void Switch(uint vertex1, uint vertex2) { // switch vertices, edges do not change id's. _graph.Switch(vertex1, vertex2); }