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);//加入同一连通分量 } }
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被加入树,并且重新计算横切边情况 } }
/// <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); } } }