Exemplo n.º 1
0
        /// <summary>
        /// 将顶点v添加到最小生成树中,并且更新数据
        /// </summary>
        /// <param name="g"></param>
        /// <param name="v"></param>
        private void visit(EdgeWeightedGraph g, int v)
        {
            // 把顶点v添加到最小生成树中,
            this.markeds[v] = true;
            // 更新数据
            IEnumerator ie = g.adj(v).GetEnumerator();

            while (ie.MoveNext())
            {
                Edge e = (Edge)ie.Current;
                // 获取e边的另一个顶点(当前顶点v)
                int w = e.other(v);
                // 判断另一个顶点是不是已经在树中,如果在树中,则不作处理,否则更新数据
                if (this.markeds[w])
                {
                    continue;
                }
                // 判断边e的权重是否小于从w顶点到树中已存在最小边的权重
                if (e.weight() < this.distTo[w])
                {
                    // 更新数据
                    this.edgeTo[w] = e;
                    this.distTo[w] = e.weight();
                    if (pq.contains(w))
                    {
                        this.pq.changeItem(w, e.weight());
                    }
                    else
                    {
                        this.pq.insert(w, e.weight());
                    }
                }
            }
        }