private void cboDSDV_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cboDSDV.Text.Equals(""))
            {
                return;
            }
            Node node;

            if (cboDSDV.SelectedIndex == 0)
            {
                node = graph[0];
            }
            else
            {
                node = busDV.getDoiTac(busDV.layMaTruong(cboDSDV.Text));
            }
            //
            List <Ds_KhoangCachCacDiem> dsTH = busDV.ds_KhoangCach(node, graph).OrderBy(d => d.KhoangCach).ToList();

            dgvDSDV.DataSource = dsTH;
            Ds_KhoangCachCacDiem kc = dsTH.Single(d => d.KhoangCach == (dsTH.Min(d1 => d1.KhoangCach)));

            lbKQ.Text    = "Khoảng cách ngắn nhất: " + kc.DiemDen + " (" + kc.KhoangCach + " mét).";
            lbKQ.Visible = true;
        }
        public List <Ds_KhoangCachCacDiem> ds_KhoangCach(Node node, List <Node> dsNode)
        {
            List <Ds_KhoangCachCacDiem> ds = new List <Ds_KhoangCachCacDiem>();

            for (int i = 0; i < dsNode.Count; i++)
            {
                Ds_KhoangCachCacDiem kc = new Ds_KhoangCachCacDiem();
                kc.DiemDi  = node.name;
                kc.DiemDen = dsNode[i].name;
                if (kc.DiemDi.Equals(kc.DiemDen))
                {
                    continue;
                }
                kc.KhoangCach = xl.harversine(node.y, node.x, dsNode[i].y, dsNode[i].x);
                ds.Add(kc);
            }
            return(ds);
        }