Skip to content

Commit f19e877

Browse files
committed
图的dfs
1 parent f5d890e commit f19e877

File tree

2 files changed

+90
-5
lines changed

2 files changed

+90
-5
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,4 @@
2323
### [单链表回文](https://github.com/chaoaiqi/study/blob/master/java/src/juejin/lc/leetCode/Palindrome.java)
2424
### [堆的实现及求一组动态数据的中位数](https://github.com/chaoaiqi/study/tree/master/java/src/juejin/lc/heap)
2525
### [求一组动态数据集合的最大 Top K](https://github.com/chaoaiqi/study/blob/master/java/src/juejin/lc/leetCode/GetTopKArrays.java)
26-
### [基于无向图的bfs和dfs]()
26+
### [基于无向图的bfs和dfs](https://github.com/chaoaiqi/study/blob/master/java/src/juejin/lc/graph/Graph.java)

java/src/juejin/lc/graph/Graph.java

Lines changed: 89 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public class Graph {
2121
*
2222
* @param count 数量
2323
*/
24+
@SuppressWarnings("unchecked")
2425
private Graph(int count) {
2526
this.count = count;
2627
adj = new LinkedList[count];
@@ -35,7 +36,7 @@ private Graph(int count) {
3536
* @param oSide order
3637
* @param rSide reversed order
3738
*/
38-
public void add(int oSide, int rSide) {
39+
private void add(int oSide, int rSide) {
3940
adj[oSide].add(rSide);
4041
adj[rSide].add(oSide);
4142
}
@@ -63,18 +64,90 @@ private void bfs(int oSide, int rSide) {
6364
int value = adj[index].get(j);
6465
if (!visited[value]) {
6566
prev[value] = index;
66-
if (index == rSide) {
67+
if (value == rSide) {
6768
print(prev, oSide, rSide);
6869
}
70+
visited[value] = true;
71+
queue.offer(value);
6972
}
7073
}
7174
}
7275
}
7376

74-
private void dfs(){
77+
private boolean found = false;
78+
/**
79+
* 深度优先搜索
80+
*
81+
* @param oSide 顺序边
82+
* @param rSide 逆序边
83+
*/
84+
private void dfs(int oSide, int rSide) {
85+
boolean[] visited = new boolean[count];
86+
int[] prev = new int[count];
87+
for (int i = 0; i < count; i++) {
88+
prev[i] = -1;
89+
}
90+
recursiveDfs(visited, prev, oSide, rSide);
91+
print(prev, oSide, rSide);
92+
}
93+
94+
/**
95+
* 递归
96+
*
97+
* @param visited visited
98+
* @param prev prev
99+
* @param oSide 顺序边
100+
* @param rSide 逆序边
101+
*/
102+
private void recursiveDfs(boolean[] visited, int[] prev, int oSide, int rSide) {
103+
if (found) return;
104+
visited[oSide] = true;
105+
if (oSide == rSide) {
106+
found = true;
107+
return;
108+
}
109+
for (int i = 0; i < adj[oSide].size(); i++) {
110+
int value = adj[oSide].get(i);
111+
if (!visited[value]) {
112+
prev[value] = oSide;
113+
recursiveDfs(visited, prev, value, rSide);
114+
}
115+
}
116+
}
117+
118+
private void createGraph() {
119+
// 0 -- 1 -- 2
120+
// | | |
121+
// 3 -- 4 -- 5
122+
// | | |
123+
// 6 -- 7 -- 8
124+
add(0,1);//add(1,0);
125+
add(0,3);//add(3,0);
126+
127+
add(1,2);//add(2,1);
128+
add(1,4);// add(4,1);
129+
130+
add(2,5);//add(5,2);
131+
132+
add(3,4);//add(4,3);
133+
add(3,6);//add(6,3);
75134

135+
add(4,5);//add(5,4);
136+
add(4,7);// add(7,4);
137+
138+
add(5,8);//add(8,5);
139+
140+
add(6,7);//add(7,6);
141+
142+
add(7,8);//add(8,7);
76143
}
77144

145+
/**
146+
* 递归正向输出图的路径
147+
* @param prev prev
148+
* @param oSide 顺序边
149+
* @param rSide 逆序边
150+
*/
78151
private void print(int[] prev, int oSide, int rSide) {
79152
if (prev[rSide] != -1 && oSide != rSide) {
80153
print(prev, oSide, prev[rSide]);
@@ -83,6 +156,18 @@ private void print(int[] prev, int oSide, int rSide) {
83156
}
84157

85158
public static void main(String[] args) {
86-
159+
int count = 9;
160+
Graph graph = new Graph(count);
161+
// 0 -- 1 -- 2
162+
// | | |
163+
// 3 -- 4 -- 5
164+
// | | |
165+
// 6 -- 7 -- 8
166+
graph.createGraph();
167+
System.out.println("BFS(广度优先搜索)");
168+
graph.bfs(0,8);
169+
System.out.println();
170+
System.out.println("DFS(深度优先搜索)");
171+
graph.dfs(0,8);
87172
}
88173
}

0 commit comments

Comments
 (0)