Skip to content

Commit d0e2533

Browse files
author
tianqing.liang
committed
图的邻接表
1 parent a4ce6f4 commit d0e2533

File tree

4 files changed

+225
-1
lines changed

4 files changed

+225
-1
lines changed

25-GraphBascis/AdjList.dart

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
import 'dart:collection';
2+
import 'dart:io';
3+
4+
/**
5+
* 图的邻接表
6+
* 因为dart自带的LinkedList的LinkedList比较特殊,它不是一个带泛型集合,
7+
* 因为它泛型类型上界是LinkedListEntry,
8+
* 内部的数据结构实现是一个双链表,
9+
* 链表的结点是LinkedListEntry的子类,
10+
* 且内部维护了_next和_previous指针。
11+
* 它并没有实现List接口
12+
* 所以无法在链表的结点是LinkedListEntry的子类中实现List 完成图的邻接表表示方法
13+
* 编译器直接报错
14+
*
15+
*/
16+
class AdjList{
17+
int? _V;//图的顶点数量
18+
int? _E;//图的边的数量
19+
List? _adj;//邻接矩阵
20+
LinkedList? _linkedList;
21+
22+
AdjList( V,E,List list) {
23+
_V = V;
24+
_E = E ;
25+
if(V < 0) throw Exception("V must be non-negative");
26+
if(E < 0) throw Exception("E must be non-negative");
27+
_adj = List.generate(V, (_)=>List.generate(V,(_)=> 0),growable: false);
28+
// _linkedList = LinkedList<LinkedListEntryImpl>();
29+
30+
for(int i =1;i<E;i++){
31+
int a = int.parse(list[i].split(" ")[0]);
32+
_validateVertex(a);
33+
int b = int.parse(list[i].split(" ")[1]);
34+
_validateVertex(b);
35+
(_linkedList!.elementAt(a) as List)[b] =1;
36+
_adj![a][b] = 1;
37+
_adj![b][a] = 1;
38+
// _linkedList!.toList(growable: true);
39+
}
40+
}
41+
42+
_validateVertex(int v){
43+
if(v < 0 || v >= _V!)
44+
throw new Exception("vertex $v is invalid");
45+
}
46+
47+
int? V(){
48+
return _V;
49+
}
50+
51+
bool hasEdge(int v, int w){
52+
_validateVertex(v);
53+
_validateVertex(w);
54+
return _adj![v][w] == 1;
55+
}
56+
57+
int _degree(int v){
58+
return _adj![v].length;
59+
}
60+
61+
int? E(){
62+
return _E;
63+
}
64+
65+
List<int> adj(int v){
66+
_validateVertex(v);
67+
List<int> res = List.filled(_V!, 0,growable: true);
68+
for(int i = 0; i < _V!; i ++)
69+
if(_adj![v][i] == 1)
70+
res.add(i);
71+
return res;
72+
}
73+
74+
@override
75+
String toString() {
76+
77+
StringBuffer sb = new StringBuffer();
78+
sb.write("V = $_V, E = $_E\n");
79+
for (int i = 0; i < _V!; i ++) {
80+
for (int j = 0; j < _V!; j ++)
81+
sb.write("${_adj![i][j]} ");
82+
sb.write('\n');
83+
}
84+
return sb.toString();
85+
}
86+
}
87+
88+
void main() async {
89+
File content = File("g.txt");
90+
List<String> list = await content.readAsLines();
91+
//读取到文件的顶点数量以及
92+
print(list[0].split(" ")[0]);
93+
print(list[0].split(" ")[1]);
94+
int v = int.parse(list[0].split(" ")[0]) ;
95+
int e = int.parse(list[0].split(" ")[1]) ;
96+
//
97+
AdjList adjList= AdjList(v, e, list);
98+
print(adjList);
99+
100+
}
101+
//class LinkedListEntryImpl<List> extends LinkedListEntry<LinkedListEntryImpl<List>> {
102+
// List? value;
103+
//
104+
// LinkedListEntryImpl(int length){
105+
// value= List.filled(length,0, growable:false);
106+
// }
107+
//
108+
// @override
109+
// String toString() {
110+
// return "value is $value";
111+
// }
112+
//}

25-GraphBascis/AdjSet.dart

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
import 'dart:collection';
2+
import 'dart:io';
3+
4+
/**
5+
* 图的邻接表
6+
7+
*
8+
*/
9+
class AdjSet {
10+
int? _V; //图的顶点数量
11+
int? _E; //图的边的数量
12+
SplayTreeSet<List<int>>? _treeSet;
13+
14+
AdjSet(V, E, List list) {
15+
_V = V;
16+
_E = E;
17+
if (V < 0) throw Exception("V must be non-negative");
18+
if (E < 0) throw Exception("E must be non-negative");
19+
_treeSet = SplayTreeSet<List<int>>();
20+
21+
22+
for (int i = 1; i < E; i++) {
23+
int a = int.parse(list[i].split(" ")[0]);
24+
_validateVertex(a);
25+
int b = int.parse(list[i].split(" ")[1]);
26+
_validateVertex(b);
27+
_treeSet!.elementAt(a)[b] = 1;
28+
_treeSet!.elementAt(b)[a] = 1;
29+
// _adj![a][b] = 1;
30+
// _adj![b][a] = 1;
31+
}
32+
}
33+
34+
_validateVertex(int v) {
35+
if (v < 0 || v >= _V!) throw new Exception("vertex $v is invalid");
36+
}
37+
38+
int? V() {
39+
return _V;
40+
}
41+
42+
bool hasEdge(int v, int w) {
43+
_validateVertex(v);
44+
_validateVertex(w);
45+
return _treeSet!.elementAt(v)[w] == 1;
46+
}
47+
48+
int _degree(int v) {
49+
return _treeSet!.elementAt(v).length;
50+
}
51+
52+
int? E() {
53+
return _E;
54+
}
55+
56+
List<int> adj(int v) {
57+
_validateVertex(v);
58+
List<int> res = List.filled(_V!, 0, growable: true);
59+
for (int i = 0; i < _V!; i++) if (_treeSet!.elementAt(v)[i] == 1) 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++) sb.write("${_treeSet!.elementAt(i)[j]} ");
69+
sb.write('\n');
70+
}
71+
return sb.toString();
72+
}
73+
}
74+
75+
void main() async {
76+
File content = File("g.txt");
77+
List<String> list = await content.readAsLines();
78+
//读取到文件的顶点数量以及
79+
print(list[0].split(" ")[0]);
80+
print(list[0].split(" ")[1]);
81+
int v = int.parse(list[0].split(" ")[0]);
82+
int e = int.parse(list[0].split(" ")[1]);
83+
//
84+
AdjSet adjList = AdjSet(v, e, list);
85+
print(adjList);
86+
}
87+
//class LinkedListEntryImpl<List> extends LinkedListEntry<LinkedListEntryImpl<List>> {
88+
// List? value;
89+
//
90+
// LinkedListEntryImpl(int length){
91+
// value= List.filled(length,0, growable:false);
92+
// }
93+
//
94+
// @override
95+
// String toString() {
96+
// return "value is $value";
97+
// }
98+
//}

25-GraphBascis/ListItem.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import 'dart:collection';
2+
3+
class LinkedListEntryImpl<int> extends LinkedListEntry<LinkedListEntryImpl<int>> {
4+
final int value;
5+
6+
LinkedListEntryImpl(this.value);
7+
8+
@override
9+
String toString() {
10+
return "value is $value";
11+
}
12+
}
13+
14+

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
22. 计数排序、LSD基数排序
2727
23. MSD排序,桶排序
2828
24. 字符串匹配
29-
25. 图的邻接矩阵
29+
25. 图的邻接矩阵,邻接表
3030

3131
#### 后续更新
3232
1. 将图相关的数据结构与算法用dart语言重新实现

0 commit comments

Comments
 (0)