Пример #1
0
 /// <summary>
 /// Trả về các cạnh kề với đỉnh
 /// </summary>
 /// <param name="start">Đỉnh xét</param>
 /// <returns>Null nếu đỉnh không có cạnh kề</returns>
 public EdgeCollection this[Node start]
 {
     get
     {
         EdgeCollection edgeCollection = new EdgeCollection();
         foreach (Edge item in _list)
         {
             if (item.start == start)
             {
                 edgeCollection.Add(item);
             }
             else if (item.IsUndirected && item.end == start)
             {
                 edgeCollection.Add(item);
             }
         }
         if (edgeCollection.Count > 0)
         {
             return(edgeCollection);
         }
         else
         {
             return(null);
         }
     }
 }
Пример #2
0
        public NodeCollection BFS(Node node)
        {
            Reset();
            NodeCollection edges_result = null;

            if (n > 0)
            {
                edges_result = new NodeCollection();
                edges_result.Add(node);
                Queue <Node> queue_nodes = new Queue <Node>();
                queue_nodes.Enqueue(node);
                node.IsVisit = true;
                while (queue_nodes.Count > 0)
                {
                    node = queue_nodes.Dequeue();
                    EdgeCollection edges = _edgeList[node];
                    if (edges != null)
                    {
                        foreach (Edge edge in edges)
                        {
                            Node node_them = edge.start == node ? edge.end : edge.start;
                            if (!node_them.IsVisit)
                            {
                                node_them.IsVisit = true;
                                queue_nodes.Enqueue(node_them);
                                edges_result.Add(node_them);
                                edge.IsSelected = true;
                            }
                        }
                    }
                }
            }
            return(edges_result);
        }
Пример #3
0
        void GetEdge_prime()
        {
            Edge           edge  = null;
            int            min   = 0;
            EdgeCollection edges = graphUI1.Data.GetAllEdgeFromNodes(nodes);
            string         text  = "Các cạnh xét :\r\n";

            foreach (Edge item in edges)
            {
                text            = text + item.ToString() + "\r\n";
                item.IsSelected = true;
                if (min > item.weight || min == 0)
                {
                    min  = item.weight;
                    edge = item;
                }
            }
            if (edge != null)
            {
                text         += "Cạnh được chọn:\r\n";
                text         += edge.ToString() + "\r\n";
                textBox.Text += text;
                graphUI1._list.Add(edge);
                edge.start.IsVisit = true;
                edge.end.IsVisit   = true;
                nodes.Add(edge.start);
                nodes.Add(edge.end);
            }
        }
Пример #4
0
        public List <NodeCollection> IsHaiPhia()
        {
            Reset();
            NodeCollection phia1 = new NodeCollection();
            NodeCollection phia2 = new NodeCollection();
            NodeCollection T;
            bool           falg = true;

            phia1.Add(_nodeList[0]);
            _nodeList[0].IsVisit = true;
            do
            {
                foreach (Node node in phia1)
                {
                    EdgeCollection edges = _edgeList[node];
                    foreach (Edge edge in edges)
                    {
                        Node node_them = edge.start == node ? edge.end : edge.start;
                        phia2.Add(node_them);
                    }
                }
                T = new NodeCollection();
                foreach (Node node in phia2)
                {
                    EdgeCollection edges = _edgeList[node];
                    foreach (Edge edge in edges)
                    {
                        Node node_them = edge.start == node ? edge.end : edge.start;
                        T.Add(node_them);
                    }
                }
                if (T.Equal(phia1))
                {
                    break;
                }
                phia1 = T;
                if (NodeCollection.giao(phia1, phia2))
                {
                    falg = false;
                    break;
                }
            }while (true);
            if (!falg)
            {
                return(null);
            }
            return(new List <NodeCollection>()
            {
                phia1, phia2
            });
        }
Пример #5
0
        /// <summary>
        /// Tìm cây khung nhỏ nhất theo thuật toán Kruskal
        /// </summary>
        /// <param name="a">Mảng chứa danh sách kề</param>
        /// <param name="n">Số đỉnh</param>
        static void Kruskal(int[,] a, int n)
        {
            EdgeCollection list = matrix_edge_convert(a, n);

            list.Sort();
            EdgeCollection listResult = new EdgeCollection();

            //danh dau nhan i cho dinh i
            int[] label = new int[n];
            for (int i = 0; i < n; i++)
            {
                label[i] = i;
            }
            int lab1 = 0;
            int lab2 = 0;

            foreach (Edge item in list)
            {
                if (label[item.start.Index] != label[item.end.Index])
                {
                    listResult.Add(item);
                    if (label[item.start.Index] > label[item.end.Index])
                    {
                        lab1 = label[item.end.Index];
                        lab2 = label[item.start.Index];
                    }
                    else
                    {
                        lab2 = label[item.end.Index];
                        lab1 = label[item.start.Index];
                    }
                    for (int i = 0; i < n; i++)
                    {
                        if (label[i] == lab2)
                        {
                            label[i] = lab1;
                        }
                    }
                }
            }
            foreach (Edge item in listResult)
            {
                Console.WriteLine(item.ToString());
            }
        }
Пример #6
0
        /// <summary>
        /// Tìm cây khung nhỏ nhất theo thuật toán Prim
        /// </summary>
        public EdgeCollection Prim(Node startNode = null)
        {
            Reset();
            EdgeCollection listResult = new EdgeCollection();

            if (startNode == null)
            {
                startNode = _nodeList[0];
            }
            Node node = startNode;

            node.IsVisit = true;
            NodeCollection nodes = new NodeCollection();

            nodes.Add(node);
            Edge edge = null;
            int  min  = 0;
            int  n    = 0;

            while (!_nodeList.IsAllVisit)
            {
                n++;
                min = 0;
                EdgeCollection edges = GetAllEdgeFromNodes(nodes);
                foreach (Edge item in edges)
                {
                    if (min > item.weight || min == 0)
                    {
                        min  = item.weight;
                        edge = item;
                    }
                }
                if (edge != null)
                {
                    listResult.Add(edge);
                    edge.start.IsVisit = true;
                    edge.end.IsVisit   = true;
                    nodes.Add(edge.start);
                    nodes.Add(edge.end);
                }
            }
            return(listResult);
        }
Пример #7
0
        public EdgeCollection GetAllEdgeFromNodes(IEnumerable <Node> nodes)
        {
            EdgeCollection edgeCollection = new EdgeCollection();

            foreach (Edge edge in _edgeList)
            {
                if (nodes.Contains(edge.start) && edge.start.IsVisit && !edge.end.IsVisit)
                {
                    edgeCollection.Add(edge);
                }
                else
                {
                    if (edge.IsUndirected && edge.end.IsVisit && !edge.start.IsVisit && nodes.Contains(edge.end))
                    {
                        edgeCollection.Add(edge);
                    }
                }
            }
            return(edgeCollection);
        }
Пример #8
0
        /// <summary>
        /// Tìm cây khung nhỏ nhất theo thuật toán Krukal
        /// </summary>
        public EdgeCollection Kruskal()
        {
            Reset();
            EdgeCollection listResult = new EdgeCollection();

            _edgeList.Sort();
            //danh dau nhan i cho dinh i
            int[] label = new int[n];
            for (int i = 0; i < n; i++)
            {
                label[i] = i;
            }
            int lab1 = 0;
            int lab2 = 0;

            foreach (Edge item in _edgeList)
            {
                if (label[item.start.Index] != label[item.end.Index])
                {
                    listResult.Add(item);
                    if (label[item.start.Index] > label[item.end.Index])
                    {
                        lab1 = label[item.end.Index];
                        lab2 = label[item.start.Index];
                    }
                    else
                    {
                        lab2 = label[item.end.Index];
                        lab1 = label[item.start.Index];
                    }
                    for (int i = 0; i < n; i++)
                    {
                        if (label[i] == lab2)
                        {
                            label[i] = lab1;
                        }
                    }
                }
            }
            return(listResult);
        }
Пример #9
0
        /// <summary>
        /// Chuyển ma trận kề về danh sách các cạnh
        /// </summary>
        /// <param name="a">ma trận kề</param>
        /// <param name="n">số đỉnh</param>
        /// <returns>Danh sách cạnh</returns>
        static EdgeCollection matrix_edge_convert(int[,] a, int n)
        {
            EdgeCollection listEdge = new EdgeCollection();
            Edge           edge;

            for (int i = 0; i < n; i++)
            {
                Node start = new Node(i);
                for (int j = i; j < n; j++)
                {
                    if (a[i, j] > 0)
                    {
                        Node end = new Node(j);
                        edge = new Edge(start, end, a[i, j]);
                        listEdge.Add(edge);
                    }
                }
            }
            // listEdge.Sort();
            return(listEdge);
        }
Пример #10
0
 void khoitao()
 {
     _edgeList         = new EdgeCollection();
     _nodeList         = new NodeCollection();
     this.IsUndirected = false;
 }
Пример #11
0
 public void Prim(Node node)
 {
     _list = _graph.Prim(node);
     Invalidate();
 }
Пример #12
0
 public void Kruskal()
 {
     _list = _graph.Kruskal();
     Invalidate();
 }