private void Visit(EdgeWeightedGraph G, int v) { marked[v] = true; foreach (Edge e in G.Adj(v)) { int w = e.Other(v); if (marked[w]) { continue; //v-w失效 } if (e.Weight < distTo[w]) { //连接w和树的最佳边Edge变为e edgeTo[w] = e; //保存w和最小生成树相连的边 distTo[w] = e.Weight; //即w和最小生成树最近的距离为e.Weight if (pq.Contains(w)) { pq.Change(w, distTo[w]); } else { pq.Insert(w, distTo[w]); } } } }//将顶点v添加到树中,更新数据
public DijkstraSP(EdgeWeightedDigraph G, int s) { edgeTo = new DirectedEdge[G.VNumber()]; distTo = new double[G.VNumber()]; pq = new IndexMinPQ <double>(G.VNumber()); for (int v = 0; v < G.VNumber(); v++) { distTo[v] = Double.PositiveInfinity; } distTo[s] = 0.0; pq.Insert(s, 0.0); while (!pq.IsEmpty()) { Relax(G, pq.DelMin()); } }
private IndexMinPQ <Double> pq; //有效的横切边 public PrimMST(EdgeWeightedGraph G) { edgeTo = new Edge[G.VNumber]; distTo = new double[G.VNumber]; marked = new bool[G.VNumber]; for (int v = 0; v < G.VNumber; v++) { distTo[v] = Double.PositiveInfinity; } pq = new IndexMinPQ <double>(G.VNumber); distTo[0] = 0.0; pq.Insert(0, 0.0); //用顶点0和权重0初始化pq while (!pq.IsEmpty()) { Visit(G, pq.DelMin()); //将最近的顶点添加到树中 } }
private void Relax(EdgeWeightedDigraph G, int v) { foreach (DirectedEdge e in G.Adj(v)) {// v->w e:v和w相连的边 int w = e.To(); if (distTo[w] > distTo[v] + e.Weight()) {// 起点到达w点的路径 > 起点到达v的路径+e的权重 distTo[w] = distTo[v] + e.Weight(); edgeTo[w] = e; if (pq.Contains(w)) { pq.Change(w, distTo[w]); } else { pq.Insert(w, distTo[w]); } } } }