Skip to content

Commit c196a5b

Browse files
committed
Krushkal
1 parent f026147 commit c196a5b

File tree

1 file changed

+154
-0
lines changed

1 file changed

+154
-0
lines changed

Graph/kruskal.py

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
2+
class Vertex(object):
3+
4+
def __init__(self, name):
5+
self.name = name;
6+
self.node = None; # !!!!
7+
8+
class Node(object):
9+
10+
def __init__(self, height, nodeId, parentNode):
11+
self.height = height;
12+
self.nodeId = nodeId;
13+
self.parentNode = parentNode;
14+
15+
class Edge(object):
16+
17+
def __init__(self, weight, startVertex, targetVertex):
18+
self.weight = weight;
19+
self.startVertex = startVertex;
20+
self.targetVertex = targetVertex;
21+
22+
def __cmp__(self, otherEdge):
23+
return self.cmp(self.weight, otherEdge.weight);
24+
25+
def __lt__(self, other):
26+
selfPriority = self.weight;
27+
otherPriority = other.weight;
28+
return selfPriority < otherPriority;
29+
30+
class DisjointSet(object):
31+
32+
def __init__(self, vertexList):
33+
self.vertexList = vertexList;
34+
self.rootNodes = [];
35+
self.nodeCount = 0;
36+
self.setCount = 0;
37+
self.makeSets(vertexList);
38+
39+
def find(self, node):
40+
41+
currentNode = node;
42+
43+
while currentNode.parentNode is not None:
44+
currentNode = currentNode.parentNode;
45+
46+
root = currentNode;
47+
currentNode = node;
48+
49+
while currentNode is not root:
50+
temp = currentNode.parentNode;
51+
currentNode.parentNode = root;
52+
currentNode = temp;
53+
54+
return root.nodeId;
55+
56+
def merge(self, node1, node2):
57+
58+
index1 = self.find(node1);
59+
index2 = self.find(node2);
60+
61+
if index1 == index2:
62+
return; # they are in the same set !!!!
63+
64+
root1 = self.rootNodes[index1];
65+
root2 = self.rootNodes[index2];
66+
67+
if root1.height < root2.height:
68+
root1.parentNode = root2;
69+
elif root1.height > root2.height:
70+
root2.parentNode = root1;
71+
else:
72+
root2.parentNode = root1;
73+
root1.height = root1.height + 1;
74+
75+
def makeSets(self, vertexList):
76+
for v in vertexList:
77+
self.makeSet(v);
78+
79+
def makeSet(self, vertex):
80+
node = Node(0, len(self.rootNodes),None);
81+
vertex.node = node;
82+
self.rootNodes.append(node);
83+
self.setCount = self.setCount + 1;
84+
self.nodeCount = self.nodeCount + 1;
85+
86+
class KruskalAlgorithm(object):
87+
88+
def spanningTree(self, vertexList, edgeList):
89+
90+
disjointSet = DisjointSet(vertexList);
91+
spanningTree = [];
92+
93+
edgeList.sort();
94+
95+
for edge in edgeList:
96+
97+
u = edge.startVertex;
98+
v = edge.targetVertex;
99+
100+
if disjointSet.find(u.node) is not disjointSet.find(v.node):
101+
spanningTree.append(edge);
102+
disjointSet.merge(u.node, v.node); # !!!! dot
103+
104+
for edge in spanningTree:
105+
print(edge.startVertex.name," - ", edge.targetVertex.name);
106+
107+
vertex1 = Vertex("a");
108+
vertex2 = Vertex("b");
109+
vertex3 = Vertex("c");
110+
vertex4 = Vertex("d");
111+
vertex5 = Vertex("e");
112+
vertex6 = Vertex("f");
113+
vertex7 = Vertex("g");
114+
115+
edge1 = Edge(2,vertex1,vertex2);
116+
edge2 = Edge(6,vertex1,vertex3);
117+
edge3 = Edge(5,vertex1,vertex5);
118+
edge4 = Edge(10,vertex1,vertex6);
119+
edge5 = Edge(3,vertex2,vertex4);
120+
edge6 = Edge(3,vertex2,vertex5);
121+
edge7 = Edge(1,vertex3,vertex4);
122+
edge8 = Edge(2,vertex3,vertex6);
123+
edge9 = Edge(4,vertex4,vertex5);
124+
edge10 = Edge(5,vertex4,vertex7);
125+
edge11 = Edge(5,vertex6,vertex7);
126+
127+
128+
vertexList = [];
129+
vertexList.append(vertex1);
130+
vertexList.append(vertex2);
131+
vertexList.append(vertex3);
132+
vertexList.append(vertex4);
133+
vertexList.append(vertex5);
134+
vertexList.append(vertex6);
135+
vertexList.append(vertex7);
136+
137+
edgeList = [];
138+
edgeList.append(edge1);
139+
edgeList.append(edge2);
140+
edgeList.append(edge3);
141+
edgeList.append(edge4);
142+
edgeList.append(edge5);
143+
edgeList.append(edge6);
144+
edgeList.append(edge7);
145+
edgeList.append(edge8);
146+
edgeList.append(edge9);
147+
edgeList.append(edge10);
148+
edgeList.append(edge11);
149+
150+
algorithm = KruskalAlgorithm();
151+
algorithm.spanningTree(vertexList, edgeList);
152+
153+
154+

0 commit comments

Comments
 (0)