Skip to content

Commit 77e9b91

Browse files
committed
find bridge
1 parent c77c379 commit 77e9b91

File tree

6 files changed

+117
-18
lines changed

6 files changed

+117
-18
lines changed

.idea/workspace.xml

Lines changed: 19 additions & 18 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

g3.txt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
7 8
2+
0 1
3+
0 2
4+
1 3
5+
2 3
6+
3 5
7+
4 5
8+
4 6
9+
5 6

out/production/Graph/Edge.class

635 Bytes
Binary file not shown.
2.2 KB
Binary file not shown.

src/Edge.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
public class Edge {
2+
3+
private int v, w;
4+
5+
public Edge(int v, int w){
6+
this.v = v;
7+
this.w = w;
8+
}
9+
10+
@Override
11+
public String toString(){
12+
return String.format("%d-%d", v, w);
13+
}
14+
}

src/FindBridges.java

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import java.util.ArrayList;
2+
3+
// 寻找桥算法 (和环算法类似)
4+
public class FindBridges {
5+
6+
private Graph G;
7+
private boolean[] visited;
8+
9+
private int ord[]; // 表示顶点的遍历顺序 ,如 ord[3] = 4 表示3这个点dfs顺序是4
10+
private int low[]; // dfs过程中,顶点v能到达的最小order值,如low[3] = 0 表示顶点3另一条路的最小顶点为0。
11+
private int cnt;
12+
13+
private ArrayList<Edge> res;
14+
15+
public FindBridges(Graph G){
16+
17+
this.G = G;
18+
visited = new boolean[G.V()];
19+
20+
res = new ArrayList<>();
21+
ord = new int[G.V()];
22+
low = new int[G.V()];
23+
cnt = 0;
24+
25+
for(int v = 0; v < G.V(); v ++)
26+
if(!visited[v])
27+
dfs(v, v);
28+
}
29+
30+
// 判断v-w是否是桥,通过w能否从另外一条路回到v或者v之前的节点
31+
32+
private void dfs(int v, int parent){
33+
34+
visited[v] = true;
35+
ord[v] = cnt; //初始
36+
low[v] = ord[v];
37+
cnt ++;
38+
39+
for(int w: G.adj(v))
40+
if(!visited[w]){
41+
dfs(w, v);
42+
// dfs结束 回退
43+
44+
low[v] = Math.min(low[v], low[w]); //更新low,对于vw这条边,如果low[w]比较小,说明他的下一节点w通过另一条路能返回,并经过v
45+
46+
if(low[w] > ord[v]) // 判断是否是桥,vw这条边, 下一个相邻点的low比order小说明有另一条路,low比较大则没有路是桥(没有等于,即父节点)
47+
res.add(new Edge(v, w));
48+
}
49+
else if(w != parent) // 被访问过,并且不是父节点,则看这个点的low值,若low值较小,说明对于vw这条边,通过这个w能从另外一条路回到v。即便切断vw也可以。
50+
low[v] = Math.min(low[v], low[w]); // 更新这个顶点的low值,即这个顶点除了父节点这条路,还有
51+
}
52+
53+
public ArrayList<Edge> result(){
54+
return res;
55+
}
56+
57+
public static void main(String[] args){
58+
59+
Graph g = new Graph("g.txt");
60+
FindBridges fb = new FindBridges(g);
61+
System.out.println("Bridges in g : " + fb.result());
62+
//
63+
// Graph g2 = new Graph("g2.txt");
64+
// FindBridges fb2 = new FindBridges(g2);
65+
// System.out.println("Bridges in g2 : " + fb2.result());
66+
//
67+
// Graph g3 = new Graph("g3.txt");
68+
// FindBridges fb3 = new FindBridges(g3);
69+
// System.out.println("Bridges in g3 : " + fb3.result());
70+
//
71+
// Graph tree = new Graph("tree.txt");
72+
// FindBridges fb_tree = new FindBridges(tree);
73+
// System.out.println("Bridges in tree : " + fb_tree.result());
74+
}
75+
}

0 commit comments

Comments
 (0)