Ejemplo n.º 1
0
        public Kruskal(WeightedEdgeGraph G)
        {
            queue = new Queue <WeightedEdge>();
            pq    = new MinPQ <WeightedEdge>(G.GetE());
            union = new int[G.GetV()];
            for (int x = 0; x < union.Count(); x++)//初始化连通分量
            {
                union[x] = x;
            }
            foreach (var e in G.edges())//初始化优先队列
            {
                pq.insert(e);
            }

            while (!pq.IsEmpty() && queue.Count < G.GetV() - 1)
            {
                var minE = pq.DeletePQHead();//最短边
                int v    = minE.either();
                int w    = minE.other(v);
                if (isConnect(v, w))
                {
                    continue;                 //会形成环
                }
                queue.Enqueue(minE);
                connect(v, w);//加入同一连通分量
            }
        }
Ejemplo n.º 2
0
        public Prim(WeightedEdgeGraph G)
        {
            dic    = new Dictionary <int, WeightedEdge>();
            marked = new bool[G.GetV()];
            queue  = new Queue <WeightedEdge>();

            visit(0, G);//从0节点开始
            while (dic.Count > 0)
            {
                int i = GetMinEdge();  //最短横切边的非树顶点
                queue.Enqueue(dic[i]); //最短横切边加入queue
                dic.Remove(i);
                visit(i, G);           //i被加入树,并且重新计算横切边情况
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// v被加入树。
        /// 在图中和v相连但另一个节点是非树中的所有边中
        /// 找出最短的那条,入字典,以供下次取最短横切边时使用
        /// </summary>
        /// <param name="v">要被加入树中的节点</param>
        private void visit(int v, WeightedEdgeGraph G)
        {
            marked[v] = true;//v被加入树
            foreach (var e in G.GetAdj(v))
            {
                int w = e.other(v);
                if (marked[w])
                {
                    continue;
                }

                if (dic.ContainsKey(w))                     //w节点还连接到别的树节点上
                {
                    if (dic[w].GetWeight() > e.GetWeight()) //此时e权重更短的话,进行替换
                    {
                        dic[w] = e;
                    }
                }
                else//w节点还没连接到别的树节点上
                {
                    dic.Add(w, e);
                }
            }
        }