Skip to content

Commit f67315c

Browse files
author
tianqing.liang
committed
图的深度优先遍历,广度优先遍历,以及相应的应用
1 parent 1d6838c commit f67315c

32 files changed

+1359
-12
lines changed

25-GraphBascis/AdjList.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class AdjList{
1515
if(V < 0) throw Exception("V must be non-negative");
1616
if(E < 0) throw Exception("E must be non-negative");
1717
_adj = List.generate(V, (_)=> LinkedList<LinkedListEntryImpl<int>>(),growable: false);
18-
for(int i =1;i<E;i++){
18+
for(int i =1;i<=E;i++){
1919
int a = int.parse(list[i].split(" ")[0]);
2020
_validateVertex(a);
2121
int b = int.parse(list[i].split(" ")[1]);

25-GraphBascis/AdjMatrix.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class AdjMatrix {
1818
if(V < 0) throw Exception("V must be non-negative");
1919
if(E < 0) throw Exception("E must be non-negative");
2020
_adj = List.generate(V, (_)=>List.generate(V,(_)=> 0),growable: false);
21-
for(int i =1;i<E;i++){
21+
for(int i =1;i<=E;i++){
2222
int a = int.parse(list[i].split(" ")[0]);
2323
_validateVertex(a);
2424
int b = int.parse(list[i].split(" ")[1]);

25-GraphBascis/AdjSet.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class AdjSet {
1717
if (E < 0) throw Exception("E must be non-negative");
1818
_treeSet = List.generate(V, (_) => SplayTreeSet<int>(), growable: false);
1919

20-
for (int i = 1; i < E; i++) {
20+
for (int i = 1; i <= E; i++) {
2121
int a = int.parse(list[i].split(" ")[0]);
2222
_validateVertex(a);
2323
int b = int.parse(list[i].split(" ")[1]);

25-GraphBascis/Graph.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class Graph{
1212
if (E < 0) throw Exception("E must be non-negative");
1313
_treeSet = List.generate(V, (_) => SplayTreeSet<int>(), growable: false);
1414

15-
for (int i = 1; i < E; i++) {
15+
for (int i = 1; i <= E; i++) {
1616
int a = int.parse(list[i].split(" ")[0]);
1717
_validateVertex(a);
1818
int b = int.parse(list[i].split(" ")[1]);

25-GraphBascis/g.txt

+5-8
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
1-
7 9
1+
7 6
22
0 1
3-
0 3
4-
1 2
5-
1 6
3+
0 2
4+
1 3
5+
1 4
66
2 3
7-
2 5
8-
3 4
9-
4 5
10-
5 6
7+
2 6

26-GraphDFS/AdjMatrix.dart

+90
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
import 'dart:io';
2+
3+
/**
4+
* 图的邻接矩阵表示方式
5+
*
6+
* 注:
7+
* 先读取文件,将相应数据赋值
8+
*/
9+
class AdjMatrix {
10+
int? _V;//图的顶点数量
11+
int? _E;//图的边的数量
12+
List? _adj;//邻接矩阵
13+
14+
15+
AdjMatrix( V,E,List list) {
16+
_V = V;
17+
_E = E ;
18+
if(V < 0) throw Exception("V must be non-negative");
19+
if(E < 0) throw Exception("E must be non-negative");
20+
_adj = List.generate(V, (_)=>List.generate(V,(_)=> 0),growable: false);
21+
for(int i =1;i<=E;i++){
22+
int a = int.parse(list[i].split(" ")[0]);
23+
_validateVertex(a);
24+
int b = int.parse(list[i].split(" ")[1]);
25+
_validateVertex(b);
26+
_adj![a][b] = 1;
27+
_adj![b][a] = 1;
28+
}
29+
}
30+
31+
_validateVertex(int v){
32+
if(v < 0 || v >= _V!)
33+
throw new Exception("vertex $v is invalid");
34+
}
35+
36+
int? V(){
37+
return _V;
38+
}
39+
40+
bool hasEdge(int v, int w){
41+
_validateVertex(v);
42+
_validateVertex(w);
43+
return _adj![v][w] == 1;
44+
}
45+
46+
int _degree(int v){
47+
return _adj![v].length;
48+
}
49+
50+
int? E(){
51+
return _E;
52+
}
53+
54+
List<int> adj(int v){
55+
_validateVertex(v);
56+
List<int> res = List.filled(_V!, 0,growable: true);
57+
for(int i = 0; i < _V!; i ++)
58+
if(_adj![v][i] == 1)
59+
res.add(i);
60+
return res;
61+
}
62+
63+
@override
64+
String toString() {
65+
StringBuffer sb = new StringBuffer();
66+
sb.write("V = $_V, E = $_E\n");
67+
for (int i = 0; i < _V!; i ++) {
68+
for (int j = 0; j < _V!; j ++)
69+
sb.write("${_adj![i][j]} ");
70+
sb.write('\n');
71+
}
72+
return sb.toString();
73+
}
74+
75+
76+
}
77+
78+
void main() async {
79+
File content = File("g.txt");
80+
List<String> list = await content.readAsLines();
81+
//读取到文件的顶点数量以及
82+
print(list[0].split(" ")[0]);
83+
print(list[0].split(" ")[1]);
84+
int v = int.parse(list[0].split(" ")[0]) ;
85+
int e = int.parse(list[0].split(" ")[1]) ;
86+
//
87+
AdjMatrix adjMatrix = AdjMatrix(v, e, list);
88+
print(adjMatrix);
89+
90+
}

26-GraphDFS/AdjMatrixDFS.dart

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import 'AdjMatrix.dart';
2+
import 'dart:io';
3+
4+
/**
5+
* 邻接矩阵的深度遍历
6+
*/
7+
class AdjMatrixDFS {
8+
AdjMatrix? G;
9+
10+
List? visited;
11+
12+
List? preList;
13+
14+
List? postList;
15+
16+
AdjMatrixDFS(AdjMatrix G) {
17+
this.G = G;
18+
visited = List.filled(G.V()!, false, growable: true);
19+
preList = List.filled(0, 0, growable: true);
20+
postList = List.filled(0, 0, growable: true);
21+
for (int v = 0; v < G.V()!; v++) {
22+
if (!(visited![v])) {
23+
_dfs(v);
24+
}
25+
}
26+
}
27+
28+
_dfs(int v) {
29+
visited![v] = true;
30+
preList!.add(v);
31+
for (int w in G!.adj(v)) {
32+
if (!visited![w]) {
33+
_dfs(w);
34+
}
35+
}
36+
postList!.add(v);
37+
}
38+
39+
pre() {
40+
return preList;
41+
}
42+
43+
post() {
44+
return postList;
45+
}
46+
}
47+
48+
void main() async {
49+
File content = File("g.txt");
50+
List<String> list = await content.readAsLines();
51+
//读取到文件的顶点数量以及
52+
print(list[0].split(" ")[0]);
53+
print(list[0].split(" ")[1]);
54+
int v = int.parse(list[0].split(" ")[0]);
55+
int e = int.parse(list[0].split(" ")[1]);
56+
//
57+
AdjMatrix adjList = AdjMatrix(v, e, list);
58+
AdjMatrixDFS graphDFS = new AdjMatrixDFS(adjList);
59+
print("DFS preOrder : ${graphDFS.pre()}");
60+
print("DFS postOrder : ${graphDFS.post()}");
61+
}

26-GraphDFS/ArrayStack.dart

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import 'Stack.dart';
2+
class ArrayStack<T> implements Stack<T>{
3+
4+
List? arr;
5+
ArrayStack(){
6+
arr =<dynamic>[];
7+
}
8+
9+
@override
10+
int getSize() {
11+
return arr!.length;
12+
}
13+
14+
@override
15+
bool isEmpty() {
16+
return arr!.isEmpty;
17+
}
18+
19+
@override
20+
T peek() {
21+
return arr![0];
22+
}
23+
24+
@override
25+
T pop() => arr!.removeLast();
26+
27+
@override
28+
void push(T e) {
29+
arr!.add(e);
30+
}
31+
32+
@override
33+
String toString() {
34+
StringBuffer buffer = new StringBuffer();
35+
buffer.write("Stack: ");
36+
buffer.write('[');
37+
for(int i = 0 ; i < arr!.length ; i ++){
38+
buffer.write(arr![i]);
39+
if(i != arr!.length - 1)
40+
buffer.write(", ");
41+
}
42+
buffer.write("] top");
43+
return buffer.toString();
44+
}
45+
46+
}

26-GraphDFS/Graph.dart

+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import 'dart:collection';
2+
import 'dart:io';
3+
4+
/**
5+
* 图
6+
*/
7+
class Graph{
8+
int? _V; //图的顶点数量
9+
int? _E; //图的边的数量
10+
List? _treeSet;
11+
12+
Graph(V, E, List list) {
13+
_V = V;
14+
_E = E;
15+
if (V < 0) throw Exception("V must be non-negative");
16+
if (E < 0) throw Exception("E must be non-negative");
17+
_treeSet = List.generate(V, (_) => SplayTreeSet<int>(), growable: false);
18+
19+
for (int i = 1; i <= E; i++) {
20+
int a = int.parse(list[i].split(" ")[0]);
21+
_validateVertex(a);
22+
int b = int.parse(list[i].split(" ")[1]);
23+
_validateVertex(b);
24+
(_treeSet![a] as SplayTreeSet).add(b);
25+
(_treeSet![b] as SplayTreeSet).add(a);
26+
}
27+
}
28+
29+
_validateVertex(int v) {
30+
if (v < 0 || v >= _V!) throw new Exception("vertex $v is invalid");
31+
}
32+
33+
int? V() {
34+
return _V;
35+
}
36+
37+
bool hasEdge(int v, int w) {
38+
_validateVertex(v);
39+
_validateVertex(w);
40+
return (_treeSet![v] as SplayTreeSet).contains(w);
41+
}
42+
43+
int _degree(int v) {
44+
return _treeSet![v].length;
45+
}
46+
47+
int? E() {
48+
return _E;
49+
}
50+
51+
adj(int v) {
52+
_validateVertex(v);
53+
return _treeSet![v];
54+
}
55+
56+
@override
57+
String toString() {
58+
StringBuffer sb = new StringBuffer();
59+
sb.write("V = $_V, E = $_E\n");
60+
for (int j = 0; j < _V!; j++) {
61+
sb.write("节点:$j ");
62+
sb.write("${_treeSet![j].toString()} ");
63+
sb.write('\n');
64+
}
65+
return sb.toString();
66+
}
67+
}
68+
void main() async {
69+
File content = File("g.txt");
70+
List<String> list = await content.readAsLines();
71+
//读取到文件的顶点数量以及
72+
print(list[0].split(" ")[0]);
73+
print(list[0].split(" ")[1]);
74+
int v = int.parse(list[0].split(" ")[0]) ;
75+
int e = int.parse(list[0].split(" ")[1]) ;
76+
//
77+
Graph adjList= Graph(v, e, list);
78+
print(adjList);
79+
80+
}

26-GraphDFS/GraphDFS.dart

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import 'Graph.dart';
2+
import 'dart:io';
3+
4+
/**
5+
* 图的深度遍历
6+
*/
7+
class GraphDFS {
8+
Graph? G;
9+
10+
List? visited;
11+
12+
List? preList;
13+
14+
List? postList;
15+
16+
GraphDFS(Graph G) {
17+
this.G = G;
18+
visited = List.filled(G.V()!, false, growable: true);
19+
preList = List.filled(0, 0, growable: true);
20+
postList = List.filled(0, 0, growable: true);
21+
for (int v = 0; v < G.V()!; v++) {
22+
if (!(visited![v])) {
23+
_dfs(v);
24+
}
25+
}
26+
}
27+
28+
_dfs(int v) {
29+
visited![v] = true;
30+
preList!.add(v);
31+
for (int w in G!.adj(v)) {
32+
if (!visited![w]) {
33+
_dfs(w);
34+
}
35+
}
36+
postList!.add(v);
37+
}
38+
39+
pre() {
40+
return preList;
41+
}
42+
43+
post() {
44+
return postList;
45+
}
46+
}
47+
48+
void main() async {
49+
File content = File("g.txt");
50+
List<String> list = await content.readAsLines();
51+
//读取到文件的顶点数量以及
52+
print(list[0].split(" ")[0]);
53+
print(list[0].split(" ")[1]);
54+
int v = int.parse(list[0].split(" ")[0]);
55+
int e = int.parse(list[0].split(" ")[1]);
56+
//
57+
Graph adjList = Graph(v, e, list);
58+
GraphDFS graphDFS = new GraphDFS(adjList);
59+
print("DFS preOrder : ${graphDFS.pre()}" );
60+
print("DFS postOrder : ${graphDFS.post()}");
61+
}

0 commit comments

Comments
 (0)