Пример #1
0
        public static void BFS(DrawingSurface ds, int start)
        {
            var adjList = ds.GetAdjList();
            var que     = new Queue <int>();

            bool[] visited = new bool[ds.Vertices.Count];

            que.Enqueue(start - 1);
            visited[start - 1] = true;

            while (que.Count > 0)
            {
                start = que.Dequeue();
                ReDrawCircle(ds, start, activeVertex, 700);

                foreach (var vertex in adjList[start])
                {
                    if (!visited[vertex])
                    {
                        ReDrawCircle(ds, vertex, processedVertex, 700);
                        que.Enqueue(vertex);
                        visited[vertex] = true;
                    }
                }
                ReDrawCircle(ds, start, processedVertex, 700);
            }
            ClearVertices(ds);
        }
Пример #2
0
        private static int[] TopologicalSort(DrawingSurface ds)
        {
            var visited = new HashSet <int>();
            var answer  = new int[ds.Vertices.Count];
            Dictionary <int, List <int> > adjList = ds.GetAdjList();
            var currentPlace = ds.Vertices.Count;

            for (var vertex = 0; vertex < ds.Vertices.Count; ++vertex)
            {
                if (!visited.Contains(vertex))
                {
                    DFS(vertex);
                }
            }

            void DFS(int start)
            {
                visited.Add(start);

                foreach (var vertex in adjList[start])
                {
                    if (!visited.Contains(vertex))
                    {
                        DFS(vertex);
                    }
                }
                answer[--currentPlace] = start;
            }

            return(answer);
        }
Пример #3
0
        public static void Colouring(DrawingSurface ds)
        {
            if (!ds.IsUndirected())
            {
                var err = new ErrorBox("Graph has to be unoriented");
                err.ShowDialog();
                return;
            }

            var rnd                = new Random {
            };
            var        adjList     = ds.GetAdjList();
            List <int> nodePowers  = ds.GetNodePowers();
            List <int> vertices    = Enumerable.Range(0, ds.Vertices.Count).OrderByDescending(u => nodePowers[u]).ToList();
            List <int> colors_list = Enumerable.Repeat(-1, ds.Vertices.Count).ToList();
            int        colors_used = 1;

            colors = colors.OrderBy(x => rnd.Next()).ToArray();
            colors_list[vertices[0]] = 0;

            foreach (var vertex in vertices)
            {
                if (vertex == vertices[0])
                {
                    continue;
                }
                var adjacentColors = new HashSet <int> {
                };
                foreach (var adjvertices in adjList[vertex])
                {
                    if (colors_list[adjvertices] != -1)
                    {
                        adjacentColors.Add(colors_list[adjvertices]);
                    }
                }
                HashSet <int> possibleColors = colors_list.Where(u => u != -1).Except(adjacentColors).ToHashSet();
                if (possibleColors.Count == 0)
                {
                    colors_used        += 1;
                    colors_list[vertex] = colors_used - 1;
                }
                else
                {
                    if (colors_list[vertex] == -1)
                    {
                        colors_list[vertex] = possibleColors.Min();
                    }
                }
            }
            foreach (var vertex in vertices)
            {
                ReDrawCircle(ds, vertex, colors[colors_list[vertex]]);
            }
            Thread.Sleep(5000);
            ClearVertices(ds);
        }
Пример #4
0
        public static void KuhnMatching(DrawingSurface ds)
        {
            Dictionary <int, List <int> > adjMatrix = ds.GetAdjList();
            var        maxMatchingColor             = Color.Yellow;
            var        used     = new List <bool>();
            List <int> matching = Enumerable.Repeat(-1, ds.Vertices.Count).ToList();

            bool dfs(int vertex)
            {
                if (used[vertex])
                {
                    return(false);
                }
                used[vertex] = true;
                foreach (var to in adjMatrix[vertex])
                {
                    if (matching[to] == -1 || (dfs(matching[to])))
                    {
                        matching[to] = vertex;
                        return(true);
                    }
                }
                return(false);
            }

            for (var i = 0; i < ds.Vertices.Count; ++i)
            {
                for (var j = 0; j < ds.Vertices.Count; ++j)
                {
                    used.Add(false);
                }
                dfs(i);
            }
            for (var i = 0; i < ds.Vertices.Count; ++i)
            {
                if (matching[i] != 1)
                {
                    for (var k = 0; k < ds.Edges.Count; ++k)
                    {
                        if (((ds.Edges[k].start == i && ds.Edges[k].end == matching[i]) ||
                             (ds.Edges[k].start == matching[i] && ds.Edges[k].end == i)))
                        {
                            ds.Edges[k].fillColor = maxMatchingColor;
                            ds.Vertices[ds.Edges[k].start].fillColor = maxMatchingColor;
                            ds.Vertices[ds.Edges[k].end].fillColor   = maxMatchingColor;
                            ds.Invalidate();
                            Thread.Sleep(2000);
                        }
                    }
                }
            }
            Thread.Sleep(5000);
            ClearEdges(ds, false);
            ClearVertices(ds);
        }
Пример #5
0
        public static void DFS(DrawingSurface ds, int start)
        {
            Stack <int> stack = new Stack <int>();

            stack.Push(start - 1);
            var adjList = ds.GetAdjList();

            bool[] visited = new bool[ds.Vertices.Count];
            while (stack.Count > 0)
            {
                var vertex = stack.Peek();
                ReDrawCircle(ds, vertex, activeVertex, 700);

                if (!visited[vertex])
                {
                    visited[vertex] = true;
                    ReDrawCircle(ds, vertex, processedVertex, 700);
                }
                bool remove = true;
                foreach (int adjvertex in adjList[vertex])
                {
                    if (!visited[adjvertex])
                    {
                        stack.Push(adjvertex);
                        remove = false;
                        ReDrawCircle(ds, vertex, processedVertex, 700);
                        break;
                    }
                }
                if (remove)
                {
                    int v = stack.Pop();
                    ReDrawCircle(ds, v, processedVertex, 700);
                }
            }
            ClearVertices(ds);
        }
Пример #6
0
        public static void ConnectedComponents(DrawingSurface ds)
        {
            int[] sortedVertices = TopologicalSort(ds);
            var   oldGraphEdges  = new List <Edge>(ds.Edges);
            Dictionary <int, List <int> > adjList = ds.GetAdjList();
            var visited        = new HashSet <int>();
            var component      = new List <int>();
            var componentsList = new List <List <int> >();
            var rnd            = new Random(Guid.NewGuid().GetHashCode());

            foreach (var edge in ds.Edges)
            {
                var tmp = edge.start;
                edge.setStart(ds.Vertices[edge.end]);
                edge.setEnd(ds.Vertices[tmp]);
            }

            foreach (var vertex in sortedVertices)
            {
                if (!visited.Contains(vertex))
                {
                    DFS(vertex);
                }
                if (component.Count != 0)
                {
                    componentsList.Add(new List <int>(component));
                    component.Clear();
                }
            }

            void DFS(int start)
            {
                visited.Add(start);
                component.Add(start);

                foreach (var vertex in adjList[start])
                {
                    if (!visited.Contains(vertex))
                    {
                        DFS(vertex);
                    }
                }
            }

            foreach (var edge in ds.Edges)
            {
                var tmp = edge.start;
                edge.setStart(ds.Vertices[edge.end]);
                edge.setEnd(ds.Vertices[tmp]);
            }
            foreach (var comp in componentsList)
            {
                var colorForCurrentComponent = Color.FromArgb(255, rnd.Next(255), rnd.Next(255), rnd.Next(255));
                foreach (var el in comp)
                {
                    ds.Vertices[el].fillColor = colorForCurrentComponent;
                }
                for (var i = 0; i < ds.Vertices.Count; ++i)
                {
                    for (var j = 0; j < ds.Vertices.Count; ++j)
                    {
                        if (i != j)
                        {
                            for (var k = 0; k < ds.Edges.Count; ++k)
                            {
                                if (((ds.Edges[k].start == i && ds.Edges[k].end == j) ||
                                     (ds.Edges[k].start == j && ds.Edges[k].end == i)) &&
                                    comp.Contains(i) && comp.Contains(j))
                                {
                                    ds.Edges[k].fillColor = colorForCurrentComponent;
                                }
                            }
                        }
                    }
                }
                ds.Invalidate();
            }
            Thread.Sleep(5000);
            ClearEdges(ds);
            ClearVertices(ds);
            ds.Invalidate();
        }