Kruskal fix+implement
This commit is contained in:
parent
b19011ed8b
commit
6668b0eeae
|
@ -504,7 +504,7 @@ class Graphs {
|
||||||
mode: FileMode.append);
|
mode: FileMode.append);
|
||||||
}
|
}
|
||||||
for (int i = 0; i < _amount; i++) {
|
for (int i = 0; i < _amount; i++) {
|
||||||
file.writeAsStringSync((i + 1).toString() + Separators.dotToConnections,
|
file.writeAsStringSync(_dots[i].getName() + Separators.dotToConnections,
|
||||||
mode: FileMode.append);
|
mode: FileMode.append);
|
||||||
var d = _dots[i].getL();
|
var d = _dots[i].getL();
|
||||||
for (var j in d.keys) {
|
for (var j in d.keys) {
|
||||||
|
@ -766,22 +766,22 @@ class Graphs {
|
||||||
Graphs? kruskal() {
|
Graphs? kruskal() {
|
||||||
//List<pair<int,pair<int,int>>> g (m); // вес - вершина 1 - вершина 2
|
//List<pair<int,pair<int,int>>> g (m); // вес - вершина 1 - вершина 2
|
||||||
List<LenDotPath> g = getSortedPathList();
|
List<LenDotPath> g = getSortedPathList();
|
||||||
// ignore: unused_local_variable
|
//int cost = 0;
|
||||||
int cost = 0;
|
|
||||||
List<Dot> res = <Dot>[];
|
List<Dot> res = <Dot>[];
|
||||||
for (int i = 0; i < _amount; i++) {
|
for (int i = 0; i < _amount; i++) {
|
||||||
res.add(Dot(_dots[i].getName()));
|
res.add(Dot(_dots[i].getName(), _dots[i].num));
|
||||||
}
|
}
|
||||||
List<int> treeId = List<int>.filled(_amount, 0);
|
List<int> treeId = List<int>.filled(_amount, 0);
|
||||||
for (int i = 0; i < _amount; ++i) {
|
for (int i = 0; i < _amount; ++i) {
|
||||||
treeId[i] = i;
|
treeId[i] = i;
|
||||||
}
|
}
|
||||||
for (int i = 0; i < g.length; ++i) {
|
for (int i = 0; i < g.length; ++i) {
|
||||||
int a = g[i].d, b = g[i].p, l = g[i].l;
|
int a = g[i].d - 1, b = g[i].p - 1;
|
||||||
if (treeId[a - 1] != treeId[b - 1]) {
|
int l = g[i].l;
|
||||||
cost += l;
|
if (treeId[a] != treeId[b]) {
|
||||||
res[i].addPath(a, b);
|
//cost += l;
|
||||||
int oldId = treeId[b - 1], newId = treeId[a];
|
res[a].addPath(b + 1, l);
|
||||||
|
int oldId = treeId[b], newId = treeId[a];
|
||||||
for (int j = 0; j < _amount; ++j) {
|
for (int j = 0; j < _amount; ++j) {
|
||||||
if (treeId[j] == oldId) {
|
if (treeId[j] == oldId) {
|
||||||
treeId[j] = newId;
|
treeId[j] = newId;
|
||||||
|
@ -789,6 +789,7 @@ class Graphs {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//_dots = res;
|
||||||
return Graphs.fromList(_name, res, _useLength, _oriented);
|
return Graphs.fromList(_name, res, _useLength, _oriented);
|
||||||
}
|
}
|
||||||
//************Алгоритмы************
|
//************Алгоритмы************
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
1
|
||||||
|
НеОриентированный
|
||||||
|
Взвешенный
|
||||||
|
A: 4|5 2|7
|
||||||
|
B: 5|7 1|7
|
||||||
|
C: 5|5
|
||||||
|
D: 6|6 1|5
|
||||||
|
E: 7|9 2|7 3|5
|
||||||
|
F: 4|6
|
||||||
|
G: 5|9
|
||||||
|
END
|
|
@ -493,6 +493,14 @@ class _DrawingPageState extends State<DrawingPage> {
|
||||||
createButton("Bfs", bfsPushed),
|
createButton("Bfs", bfsPushed),
|
||||||
createButton("Dfs", dfsPushed),
|
createButton("Dfs", dfsPushed),
|
||||||
createButton("Dijkstra", dijkstraPushed),
|
createButton("Dijkstra", dijkstraPushed),
|
||||||
|
createButton("Kruskal", () {
|
||||||
|
clearDropDownVals();
|
||||||
|
setState(() {
|
||||||
|
currOp = "OP: Kruscal algo";
|
||||||
|
graphData.kruskal();
|
||||||
|
});
|
||||||
|
clearInputData();
|
||||||
|
}),
|
||||||
createButton("Clear OP", () {
|
createButton("Clear OP", () {
|
||||||
clearDropDownVals();
|
clearDropDownVals();
|
||||||
clearInputData();
|
clearInputData();
|
||||||
|
|
|
@ -404,6 +404,52 @@ class Graphs {
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<int>? getLongestPath([int start = 1]) {
|
||||||
|
start--;
|
||||||
|
if (start < 0 || start >= _amount) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
int max = -1;
|
||||||
|
int inD = -1;
|
||||||
|
int out = -1;
|
||||||
|
List<int>? res = <int>[];
|
||||||
|
for (int i = start; i < _amount; i++) {
|
||||||
|
var lens = _dots[i].getL();
|
||||||
|
for (var d in lens.keys) {
|
||||||
|
if (lens[d]! > max) {
|
||||||
|
max = lens[d]!;
|
||||||
|
inD = i + 1;
|
||||||
|
out = d;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (inD == -1) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
res.add(inD);
|
||||||
|
res.add(out);
|
||||||
|
res.add(max);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<LenDotPath> getSortedPathList() {
|
||||||
|
int max = -1;
|
||||||
|
int inD = -1;
|
||||||
|
int out = -1;
|
||||||
|
List<LenDotPath> result = <LenDotPath>[];
|
||||||
|
for (int i = 0; i < _amount; i++) {
|
||||||
|
var lens = _dots[i].getL();
|
||||||
|
for (var d in lens.keys) {
|
||||||
|
max = lens[d]!;
|
||||||
|
inD = i + 1;
|
||||||
|
out = d;
|
||||||
|
result.add(LenDotPath(max, inD, out));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result.sort((a, b) => a.l.compareTo(b.l));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/*List<Dot> getNoRepeatDots() {
|
/*List<Dot> getNoRepeatDots() {
|
||||||
List<Dot> ret = <Dot>[];
|
List<Dot> ret = <Dot>[];
|
||||||
for (int i = 0; i < _amount; i++) {
|
for (int i = 0; i < _amount; i++) {
|
||||||
|
@ -458,7 +504,7 @@ class Graphs {
|
||||||
mode: FileMode.append);
|
mode: FileMode.append);
|
||||||
}
|
}
|
||||||
for (int i = 0; i < _amount; i++) {
|
for (int i = 0; i < _amount; i++) {
|
||||||
file.writeAsStringSync((i + 1).toString() + Separators.dotToConnections,
|
file.writeAsStringSync(_dots[i].getName() + Separators.dotToConnections,
|
||||||
mode: FileMode.append);
|
mode: FileMode.append);
|
||||||
var d = _dots[i].getL();
|
var d = _dots[i].getL();
|
||||||
for (var j in d.keys) {
|
for (var j in d.keys) {
|
||||||
|
@ -657,11 +703,6 @@ class Graphs {
|
||||||
}
|
}
|
||||||
|
|
||||||
List<int?> dijkstra(int from) {
|
List<int?> dijkstra(int from) {
|
||||||
/*
|
|
||||||
int n;
|
|
||||||
... чтение n ...
|
|
||||||
//vector<vector<pair<int,int>>> g(_amount);
|
|
||||||
*/
|
|
||||||
List<int?> d = List<int?>.filled(_amount, intMax);
|
List<int?> d = List<int?>.filled(_amount, intMax);
|
||||||
List<int> p = List<int>.filled(_amount, -1);
|
List<int> p = List<int>.filled(_amount, -1);
|
||||||
|
|
||||||
|
@ -692,5 +733,75 @@ class Graphs {
|
||||||
}
|
}
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<int?>? prim() {
|
||||||
|
// работоспособность?
|
||||||
|
List<bool> used = List<bool>.filled(_amount, false);
|
||||||
|
List<int> minE = List<int>.filled(_amount, intMax);
|
||||||
|
List<int> selE = List<int>.filled(_amount, -1);
|
||||||
|
minE[0] = 0;
|
||||||
|
for (int i = 0; i < _amount; ++i) {
|
||||||
|
int v = -1;
|
||||||
|
for (int j = 0; j < _amount; ++j) {
|
||||||
|
if (!used[j] && (v == -1 || minE[j] < minE[v])) {
|
||||||
|
v = j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (minE[v] == intMax) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
used[v] = true;
|
||||||
|
if (selE[v] != -1) {
|
||||||
|
print("${v + 1} ${selE[v]}");
|
||||||
|
}
|
||||||
|
for (int to in _dots[v].getL().keys) {
|
||||||
|
if (_dots[v].getL()[to]! < minE[to - 1]) {
|
||||||
|
minE[to] = _dots[v].getL()[to]!;
|
||||||
|
selE[to] = v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Graphs? kruskal() {
|
||||||
|
//List<pair<int,pair<int,int>>> g (m); // вес - вершина 1 - вершина 2
|
||||||
|
List<LenDotPath> g = getSortedPathList();
|
||||||
|
//int cost = 0;
|
||||||
|
List<Dot> res = <Dot>[];
|
||||||
|
for (int i = 0; i < _amount; i++) {
|
||||||
|
res.add(Dot(_dots[i].getName(), _dots[i].num));
|
||||||
|
}
|
||||||
|
List<int> treeId = List<int>.filled(_amount, 0);
|
||||||
|
for (int i = 0; i < _amount; ++i) {
|
||||||
|
treeId[i] = i;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < g.length; ++i) {
|
||||||
|
int a = g[i].d - 1, b = g[i].p - 1;
|
||||||
|
int l = g[i].l;
|
||||||
|
if (treeId[a] != treeId[b]) {
|
||||||
|
//cost += l;
|
||||||
|
res[a].addPath(b + 1, l);
|
||||||
|
int oldId = treeId[b], newId = treeId[a];
|
||||||
|
for (int j = 0; j < _amount; ++j) {
|
||||||
|
if (treeId[j] == oldId) {
|
||||||
|
treeId[j] = newId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_dots = res;
|
||||||
|
return Graphs.fromList(_name, res, _useLength, _oriented);
|
||||||
|
}
|
||||||
//************Алгоритмы************
|
//************Алгоритмы************
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class LenDotPath {
|
||||||
|
late int l;
|
||||||
|
late int d;
|
||||||
|
late int p;
|
||||||
|
LenDotPath(int len, dot, path) {
|
||||||
|
l = len;
|
||||||
|
d = dot;
|
||||||
|
p = path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
1
|
||||||
|
НеОриентированный
|
||||||
|
Взвешенный
|
||||||
|
A: 2|7 4|5
|
||||||
|
B: 1|7 4|9 3|8 5|7
|
||||||
|
C: 2|8 5|5
|
||||||
|
D: 1|5 2|9 5|15 6|6
|
||||||
|
E: 3|5 2|7 4|15 6|8 7|9
|
||||||
|
F: 4|6 5|8 7|11
|
||||||
|
G: 6|11 5|9
|
||||||
|
END
|
Loading…
Reference in New Issue