Skip to content

Commit aa4529c

Browse files
committed
[Function add]
1.Prim MST algorithm.
1 parent 46f483a commit aa4529c

File tree

3 files changed

+122
-0
lines changed

3 files changed

+122
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package ca.mcmaster.chapter.four.graph.mstree;
2+
3+
import edu.princeton.cs.algs4.IndexMinPQ;
4+
5+
public class PrimMst implements MST {
6+
private Edge[] edgeTo;
7+
private double[] distTo;
8+
private boolean[] marked;
9+
private IndexMinPQ<Double> pq;
10+
public PrimMst(EdgeWeightedGraph g) {
11+
edgeTo = new Edge[g.V()];
12+
distTo = new double[g.V()];
13+
marked = new boolean[g.V()];
14+
for(int i = 0; i < g.V(); i++){
15+
distTo[i] = Double.POSITIVE_INFINITY;
16+
}
17+
pq = new IndexMinPQ<Double>(g.V());
18+
distTo[0] = 0.0d;
19+
while(!pq.isEmpty())
20+
visit(g, pq.delMin());
21+
}
22+
private void visit(EdgeWeightedGraph g, int v){ //当前的顶点不在最小树中
23+
marked[v] = true;
24+
for(Edge e : g.adj(v)){ //遍历连接这个顶点的所有边
25+
int w = e.other(v); //找到这些边中除了v的另一个顶点
26+
if(marked[w]) continue; //v-w已经在树中,失效
27+
if(e.weight() < distTo[w]){ //判断是不是可以替代
28+
edgeTo[w] = e;
29+
distTo[w] = e.weight();
30+
if(pq.contains(w)) pq.change(w, distTo[w]);
31+
else pq.insert(w, distTo[w]);
32+
}
33+
}
34+
}
35+
@Override
36+
public Iterable<Edge> edges() {
37+
return null;
38+
}
39+
@Override
40+
public double weight() {
41+
return 0;
42+
}
43+
}

DataStructrue/Graph/MinimumSpanningTrees.md

+36
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ public interface MST {
141141
![Prim轨迹](https://i.imgur.com/mURZUQo.jpg)
142142

143143
* Prim实现类
144+
* LazyPrim
144145
```Java
145146
public class LazyPrimMST implements MST {
146147
private final EdgeWeightedGraph g;
@@ -188,4 +189,39 @@ public class LazyPrimMST implements MST {
188189
System.out.println("Weight: " + mst.weight());
189190
}
190191
}
192+
```
193+
* 即时Prim
194+
![即时Prim](https://i.imgur.com/2WX62dl.jpg)
195+
```Java
196+
public class PrimMst implements MST {
197+
private Edge[] edgeTo;
198+
private double[] distTo;
199+
private boolean[] marked;
200+
private IndexMinPQ<Double> pq;
201+
public PrimMst(EdgeWeightedGraph g) {
202+
edgeTo = new Edge[g.V()];
203+
distTo = new double[g.V()];
204+
marked = new boolean[g.V()];
205+
for(int i = 0; i < g.V(); i++){
206+
distTo[i] = Double.POSITIVE_INFINITY;
207+
}
208+
pq = new IndexMinPQ<Double>(g.V());
209+
distTo[0] = 0.0d;
210+
while(!pq.isEmpty()) //一定会访问到所有的顶点
211+
visit(g, pq.delMin()); //将所有的有效横切边从队列中读取出来。
212+
}
213+
private void visit(EdgeWeightedGraph g, int v){ //当前的顶点不在最小树中
214+
marked[v] = true;
215+
for(Edge e : g.adj(v)){ //遍历连接这个顶点的所有边
216+
int w = e.other(v); //找到这些边中除了v的另一个顶点
217+
if(marked[w]) continue; //v-w已经在树中,失效
218+
if(e.weight() < distTo[w]){ //判断是不是可以替代
219+
edgeTo[w] = e;
220+
distTo[w] = e.weight();
221+
if(pq.contains(w)) pq.change(w, distTo[w]);
222+
else pq.insert(w, distTo[w]);
223+
}
224+
}
225+
}
226+
}
191227
```

DataStructrue/Graph/PrimMst.java

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package ca.mcmaster.chapter.four.graph.mstree;
2+
3+
import edu.princeton.cs.algs4.IndexMinPQ;
4+
5+
public class PrimMst implements MST {
6+
private Edge[] edgeTo;
7+
private double[] distTo;
8+
private boolean[] marked;
9+
private IndexMinPQ<Double> pq;
10+
public PrimMst(EdgeWeightedGraph g) {
11+
edgeTo = new Edge[g.V()];
12+
distTo = new double[g.V()];
13+
marked = new boolean[g.V()];
14+
for(int i = 0; i < g.V(); i++){
15+
distTo[i] = Double.POSITIVE_INFINITY;
16+
}
17+
pq = new IndexMinPQ<Double>(g.V());
18+
distTo[0] = 0.0d;
19+
while(!pq.isEmpty())
20+
visit(g, pq.delMin());
21+
}
22+
private void visit(EdgeWeightedGraph g, int v){ //当前的顶点不在最小树中
23+
marked[v] = true;
24+
for(Edge e : g.adj(v)){ //遍历连接这个顶点的所有边
25+
int w = e.other(v); //找到这些边中除了v的另一个顶点
26+
if(marked[w]) continue; //v-w已经在树中,失效
27+
if(e.weight() < distTo[w]){ //判断是不是可以替代
28+
edgeTo[w] = e;
29+
distTo[w] = e.weight();
30+
if(pq.contains(w)) pq.change(w, distTo[w]);
31+
else pq.insert(w, distTo[w]);
32+
}
33+
}
34+
}
35+
@Override
36+
public Iterable<Edge> edges() {
37+
return null;
38+
}
39+
@Override
40+
public double weight() {
41+
return 0;
42+
}
43+
}

0 commit comments

Comments
 (0)