public LazyPrimMST(IEdgeWeightGraph g) { pq = new MinPQ <IEdge>(); marked = new bool[g.V]; mst = new Chapter1.Queue <IEdge>(); Visit(g, 0);//假设G是联通的 while (!pq.IsEmpty) { IEdge e = pq.Delete(); //找到权重最小的边 int v = e.Either; int w = e.Other(v); if (marked[v] && marked[w]) //跳过失效的边 { continue; } mst.Enqueue(e); //将边添加到树中 if (!marked[v]) { Visit(g, v); } if (!marked[w]) { Visit(g, w); } } }
private void Bfs(IGraph g, int s) { var queue = new Chapter1.Queue <int>(); marked[s] = true; //起点被标记 queue.Enqueue(s); while (!queue.IsEmpty) { int v = queue.Dequeue(); //从队列中删除一个顶点 foreach (int w in g.Adj(v)) { if (!marked[w]) { edgeTo[w] = v; marked[w] = true; queue.Enqueue(w); } } } }
private IEnumerable <IDirectedEdge> cycle; //edgeTo中是否含有负权重环 public BellmanFordSP(IEdgeWeightedDIgraph G, int s) : base(G, s) { onQ = new bool[G.V]; queue = new Chapter1.Queue <int>(); queue.Enqueue(s); onQ[s] = true; while (!queue.IsEmpty && !HasNegativeCycle()) { int v = queue.Dequeue(); onQ[v] = false; Relax(G, v); } }
public IEnumerable <IEdge> Edges() { var mst = new Chapter1.Queue <IEdge>(); for (int v = 0; v < edgeTo.Length; v++) { IEdge e = edgeTo[v]; if (e != null) { mst.Enqueue(e); } } return(mst); }
private void Relax(IEdgeWeightedDIgraph g, int v) { foreach (var e in g.Adj(v)) { int w = e.To; if (distTo[w] > distTo[v] + e.Weight) { distTo[w] = distTo[v] + e.Weight; edgeTo[w] = e; if (!onQ[w]) { queue.Enqueue(w); onQ[w] = true; } } if (cost++ % g.V == 0) { FindNegativeCycle(); } } }
public KruskalMST(IEdgeWeightGraph G) { mst = new Chapter1.Queue <IEdge>(); MinPQ <IEdge> pq = new MinPQ <IEdge>(); foreach (var e in G.Edges()) { pq.Insert(e); } UF uf = new UF(G.V); while (!pq.IsEmpty && mst.Size < G.V - 1) { IEdge e = pq.Delete(); //找到权重最小的边 int v = e.Either, w = e.Other(v); if (uf.Connected(v, w)) //忽略失效的边 { continue; } uf.Union(v, w); mst.Enqueue(e); } }