-
- ืคืืืื ืืืจืฉืื - Floyd Warshall
- ืืขืืืช ืืืงืืืงืื
- ืชืช ืืขืจื ืขื ืกืืื ืชืืื ืืงืกืืืื
- ืชืช ืืืจืืฆื ืขื ืกืืื ืชืืื ืืงืกืืืื
- ืขืฅ ืคืืจืฉ ืืื ืืืื
- ืืขืืจ ืขื ืืจืคืื
- ืงืืืจ ืืจืืืืก ืืขืฆืื
- ืืฆืืืช ืงืืืจ, ืจืืืืก ืืืจืืืื ืฉื ืขืฅ ืข"ื ืืืืืจืืชื ืฉืจืืคืช ืขืืื
- ืืฆืืืช ืงืืืจ ืฉื ืขืฅ ืข"ื ืืืืืจืืชื ืกืจืืงื ืืขืืืง
- ืืฆืืืช ืืืกืืื ืฉื ืงืืืจ ืืขืฅ ืข"ื ืืืืืจืืชื ืกืจืืงื ืืขืืืง
- ืืืืงื ืืื ืงืืืงืื ื ืชืื ื ืืฆื ืขื ืงืืืจ ืืขืฅ
- ืงืื ืืืคืื - Huffman code
- ืืืืงืกืืจื Dijkstra
- ืื ืืืช ืขืฅ ืืจืฉืืืช ืืจืืืช
- ืืืืืืืจืคืืื ืฉื ืขืฆืื
ืืจืฃ ืื ืืืืฉืงื: ืืคืขืืืื ืืื ืืืืืง ืื ืงืืื ืืกืืื ืืืฉืื ืืื ืงืืืงืื ืืกืืืืื ืืงืืืงืื ืืืจ
- ืกืืืืืืืช:
O(n^3)
FW-UnWheighted(g[N,N]) :
for k=0 to N :
for i=0 to N :
for j=0 to N :
g[i,j] = g[i,j] || (g[i,k] AND g[k,j])ืืจืฃ ืืืืฉืงื - ืืฆืืืช ืื ืืืจืืงืื ืืงืฆืจืื ืืืืชืจ ืืืจืฃ ืืื ืื ืืื ืงืืืงืืืื:
- ืกืืืืืืืช:
O(n^3)
FW-wheighted(g[N,N]) :
for k=0 to N :
for i=0 to N :
for j=0 to N :
if g[i,j] > g[i,k] + g[k,j] :
g[i,j] = g[i,k] + g[k,j]- ืกืืืืืืืช:
O(n^3)
FW-wheighted-paths(g[N,N]) :
New empty-string paths[N,N]
for i=0 to N :
for j=0 to N :
paths[i,j] = i + "->" + j
for k=0 to N :
for i=0 to N :
for j=0 to N :
if g[i,j] > g[i,k] + g[k,j] :
g[i,j] = g[i,k] + g[k,j]
paths[i,j] = paths[i,k] + "->" + paths[k,j]
return pathsืืจืฃ ืื ืืืืื - ืืืืงืช ืงืฉืืจืืช:
- ืืกืคืืง ืืืคืขืื ืคืืืืื ืืืจืฉื ืขื ืืืจืฃ ืืื ืืืืืง ืืช ืืฉืืจื ืืจืืฉืื ื. ืื ืื ืืืงืืืงืื ืืจืืฉืื ืืฉ ืืกืืื ืืืืื ืื ืืคืฉืจ ืืฉืจ ืืืืื ืฉืืืจืฃ ืงืฉืืจ
- ืกืืืืืืืช:
O(n^3)
isConnected-UnDirected-graphs(g[N,N]) :
FW(g)
for i=1 to N :
if g[0,i] = false :
return false
return trueืืืืงืช ืงืฉืืจืืช ืฉื ืืจืคืื ืื ืืืืื ืื:
- ืกืืืืืืืช:
O(n^3)
isConnected-Directed-graphs(g[N,N]) :
FW(g)
for i=0 to N :
if g[0,i] = โ :
return false
return trueืืืืงื ืืื ืงืืื ืืขืื ืฉืืืื ืืืจืฃ ืืืืื:
- ืืกืคืืง ืืืกืชืื ืขื ืืืืืกืื ืืจืืฉื ืืืจื ืืคืขืืช
Floyd-Washall - ืกืืืืืืืช:
O(n^3)
Has-Negative-Cycles-Directed(g[N,N]) :
FW(g)
for i=0 to N :
if g[i,i] < 0 :
return true
return false- ืืื ืฆืืจื ืืืคืขืื
Floyd-Washall - ืื ืงืืืืช ืฆืืข ืขื ืืฉืงื ืฉืืืื ืื ืงืืื ืืขืื ืฉืืืื ืืืจืฃ ืื ืืืืื
- ืกืืืืืืืช:
O(n^2)
Has-Negative-Cycles-UnDirected(g[N,N]) :
for i=0 to N :
for j=0 to N :
if g[i,j] < 0:
return true
return falseืืืฉืื ืืจืืืช ืงืืืงืืืื ืืืืจืืฆืช ืืจืืงืื ืืืจืฃ ืืืืฉืงื ืืื ืืืืื:
- ืกืืืืืืืช:
O(n^2)
Degrees-of-vertices(g[N,N]) :
New D[N] = {0,0,..,0}
for i=0 to N :
for j=0 to N :
if i โ j AND g[i,j] โ โ:
D[i]++
D[j]++
sort(D)
return Dืืืฉืื ืืจืืืช ืงืืืงืืืื ืืืืจืืฆืช ืฉืื ืืืืช ืืืจืฃ ืื ืืืืฉืงื ืืื ืืืืื:
- ืกืืืืืืืช:
O(n^2)
Degrees-of-vertices(g[N,N]) :
New D[N] = {0,0,..,0}
for i=0 to N :
for j=0 to N :
if g[i,j] = true:
D[i]++
D[j]++
sort(D)
return DBottles-Problem(b1, b2) :
mat = Bottles-Problem-Create-Matrix(b1, b2)
return Bottles-Problem-Get-Paths(mat, max(b1, b2))ืฉืื ืจืืฉืื - ืื ืืืช ืืืจืืฆืช ืืืขืืจืื ืืืฆื ืืืฆื:
- ืกืืืืืืืช:
O(n^2)
Bottles-Problem-Create-Matrix(b1, b2) :
size = (b1+1)*(b2+1)
max = max(b1, b2)
new mat[size, size]
for i=0 to b1 :
for j=0 to b2 :
index = getindex(max, i, j)
1. mat[index, getIndex(max, 0, j)] = 1
2. mat[index, getIndex(max, i, 0)] = 1
3. mat[index, getIndex(max, b1, j)] = 1
4. mat[index, getIndex(max, i, b2)] = 1
5. mat[index, getIndex(max, min(b1, i+j), i+j-min(b1, i+j))] = 1
6. mat[index, getIndex(max, i+j-min(b2, i+j) , min(b2, i+j))] = 1
return mat
getIndex(n, i, j) :
return (n+1) * i + jืฉืื ืฉื ื - ืืฆืืจืช ืืืจืืฆืช ืืกืืืืื ืืืฆื ืืืฆื:
- ืกืืืืืืืช:
O(n^2)
Bottles-Problem-Get-Paths(mat[size, size], n) :
New paths[size, size]
for i=0 to size :
x1, y1 = getPairFromIndex(n, i)
for j=0 to size :
x2, y2 = getPairFromIndex(n, i)
if mat[i, j] โ โ :
paths[i, j] = "("+x1+","+y1+") โ ("+x2+","+y2+")"
for k=0 to size :
for i=0 to size :
for j=0 to size :
if mat[i,j] > mat[i,k] + mat[k,j] :
mat[i,j] = mat[i,k] + mat[k,j]
paths[i,j] = paths[i,k] + "โ" + paths[k,j]
return paths
getPairFromIndex(n, i) :
return { i/(n+1), i%(n+1) }ืืจืกื ืืงืืฆืจืช ืืฉืฆืจืื ืจืง ืืช ืืกืืื ืืื ืืื ืืงืกืื
- ืกืืืืืืืช:
O(n)
Best-basic(A[N]) :
maxSum = tempSum = -โ
for i=0 to N :
tempSum += A[i]
maxSum = max(maxSum, tempSum)
tempSum = max(tempSum, 0)
return maxSumืืจืกื ืจืืืื ืืฉืฆืจืื ืืช ืืกืืื ืืืช ืืืื ืืงืกืื ืฉื ืชืช ืืืขืจื
- ืกืืืืืืืช:
O(n)
Best(A[N]) :
maxSum = tempSum = -โ
start = end = 0
for i=0 to N :
tempSum += A[i]
if maxSum < tempSum :
maxSum = tempSum
end = i
if tempSum < 0:
tempSum = 0
start = i+1
return {maxSum, start, end}ืืจืกื ืืขืืืืช ืืฉืื ืฆืจืื ืืื ืืงืกืื:
- ืกืืืืืืืช:
O(n)
Best-Cycle(A[N]) :
totalSum = sum(A)
return max(Best(A), totalSum - Best(-A))ืืจืกื ืืขืืืืช ืืืื ืืื ืืงืกืื:
- ืกืืืืืืืช:
O(n)
Best-Cycle(A[N]) :
totalSum = sum(A)
max1, start1, end1 = Best(A)
max2, start2, end2 = Best(-A)
if max1 > totalSum + max2 :
return {max1, start1, end1}
else
return {totalSum + max2, end2 + 1, start2 - 1}ืืขืืืช ืชืื ืืช ืืืืง:
- ืืืจื ืืืฆืื ืชืื ื ืืื ื ืืคืฉืจ ืืืกืืข ืืืขืฉืืช ืกืืืื ืฉืื.
- ืืืขืจื A ืืืืฆื ืืช ืืืืช ืืืืง ืืื ืชืื ืืช ืืืขืจื B ืืืืฆื ืืช ืขืืืช ืื ืกืืขื ืืืืง ืืชืื ื ืืชืื ื.
- ืกืืืืืืืช:
O(n)
Gas-Stations-Problem(A[N], B[N]) :
C[N]
sum = 0
for i=0 to N :
C[i] = A[i] - B[i]
sum += C[i]
if sum < 0 :
return "No solution"
return Best-Cycle(C)ืืจืกื ืืงืืฆืจืช ืืฉืฆืจืื ืจืง ืืช ืืกืืื ืืื ืืื ืืงืกืื:
- ืกืืืืืืืช:
O(n^3)
Super-Best-basic(A[rows,cols]):
maxSum = 0
for i=0 to rows :
New help[cols]
for j=i to rows :
for k=0 to cols :
help[k] += A[j,k]
maxSum = max(maxSum, Best-basic(help))
return maxSumืืจืกื ืจืืืื ืืฉืฆืจืื ืืช ืืกืืื ืืืช ืืืื ืืงืกืื ืฉื ืชืช ืืืืจืืฆื:
- ืกืืืืืืืช:
O(n^3)
Super-Best(A[rows,cols]) :
maxSum, start_x, start_y ,end_x, end_y = 0
for i=0 to rows :
New help[cols]
for j=i to rows :
for k=0 to cols :
help[k] += A[j,k]
tempSum, tempStart, tempEnd = best(help)
if maxSum < tempSum :
maxSum = tempSum
start_x = tempStart
end_x = tempEnd
start_y = i
end_y = j
return {maxSum, start_x, start_y, end_x, end_y}Huffman(C) :
Q = C
while |Q| > 1 :
New node z
z.left = x = q.extractMin()
z.right = y = q.extractMin()
z.freq = x.freq + y.freq
Q.insert(z)
return Q.extrctMin()ืฉืื ืฉื ื - ืืืฆืืช ืืืืฆืืืื ืืืื ืืจืืื ืฉื ืื ืชื ืืืขืฅ:
- ืกืืืืืืืช:
O(n)
Huffman-process(root = Huffman(C)) :
if(root.left == null AND root.right == null) :
print(root.char)
else:
print('0' + Huffman-process(root.left)
print('1' + Huffman-process(root.right)ืงืื ืืืคืื - ืืืฉืจ ืืขืจื ืืชืืื ืืืืื ืืคื ืฉืืืืืืืช:
- ืกืืืืืืืช:
O(n)
Huffman-sorted(C) :
Q1 = C
Q2 = โ
while |Q1| + |Q2| > 1 :
New node z
z.left = x = getMin(Q1,Q2)
z.right = y = getMin(Q1,Q2)
z.freq = x.freq + y.freq
Q2.insert(z)
return getMin(Q1, Q2)
getMin(Q1,Q2):
if Q1 = โ
:
return Q2.dequeue()
if Q2 = โ
:
return Q1.dequeue()
if Q1.front < Q2.front :
return Q1.dequeue()
else return Q2.dequeue()ืืฆืืจืช ืขืฅ ืคืืจืฉ ืืื ืืืื - ืงืจืืกืงื:
- ืกืืืืืืืช:
O(|E|log|E|)
MST-Kruskal(G) :
T = โ
for each v in V : makeSet(v)
sort E by weights
for each (u,v) in E :
if findSet(u) โ findSet(v) :
T.add((u,v))
union(u, v)
return Tืืฆืืจืช ืขืฅ ืคืืจืฉ ืืื ืืืื - ืงืจืืกืงื ืืคืื:
- ืืจืขืืื ืืื ืืืชืืื ืขื "ืขืฅ" ืฉืืฉ ืื ืืช ืื ืืฆืืขืืช ืฉื G. ื ืขืืืจ ืขื ืืฆืืขืืช ืืืืืืืืช ืืงืื ืืช ืื ืฉืื ืขื ืื ืฆืืข ืืื ืืคืฉืจ ืื ืชืง ืืืชื ืืืืจืฃ ืืืื ืขืืืื ืืืฉืืจ ืงืฉืืจ. ืื ืื ื ืืืง ืืช ืืฆืืข ืืืขืฅ, ืืื ืืืืชื ืืืืคื ืขื ืฉื ืืืข ืืขืฅ ืืืืื ืชืงืื.
- ืกืืืืืืืช:
O(|E|(|E|+|V|))
MST-Reversed-Kruskal(G) :
T = E
Q = E
while |T| > |V|-1 :
e = Q.extractMax()
G.removeEdge(e)
if isConnected = false :
G.addEdge(e)
return Tืืฆืืจืช ืขืฅ ืคืืจืฉ ืืื ืืืื - ืคืจืื:
- ืกืืืืืืืช:
O(|V|+|E|log|V|)
MST-Prim(G) :
T = โ
for each v in V :
v.key = โ
v.prev = null
V[0].key = 0
Q = V
while Q โ โ
:
u = Q.extractMin()
if u.prev โ null :
T.add((u, u.prev))
for each v in adj[u] :
if v in Q AND v.key > w(u,v) :
v.key = w(u,v)
v.prev = u
return Tืืฆืืจืช ืขืฅ ืคืืจืฉ ืืื ืืืื - ืืืจืืืงื:
- ืกืืืืืืืช:
O(|E|log|V|)
MST-Boruvka(G) :
T = โ
for each v in V : makeSet(v)
while |T| < |V|-1 :
New cheapest[|V|] := array of edges
for (u,v) in E :
g1 = findSet(u)
g2 = findSet(v)
if g1 โ g2 :
if w(cheapest[g1]) > w(u,v) :
w(cheapest[g1]) = w(u,v)
if w(cheapest[g2]) > w(u,v) :
w(cheapest[g2]) = w(u,v)
for i=0 to |v| :
if cheapest[i] โ null :
T.add(cheapest[i])
union(cheapest[i].u, cheapest[i].v)
return Tืืขืืจ ืขื ืืจืฃ ืืืืฆืขืืช ืกืจืืงื ืืจืืื:
- ืกืืืืืืืช:
O(|V|+|E|)
BFS(G, s) :
for each v in V :
v.color = WHITE, v.dist = โ, v.prev = null
s.color = GRAY, s.dist = 0, s.prev = -1
Q = {s}
while Q โ โ
:
u = Q.dequeue()
for each v in adj[u] :
if v.color = WHITE :
v.color = GRAY
v.dist = u.dist + 1
v.prev = u
Q.enqueue(v)
u.color = BLACKDFS(G) :
for each v in V : v.color = WHITE
for each v in V :
if v.color = WHITE :
DFS-VISIT(G, v)
DFS-VISIT(G, n) :
n.color = GRAY
for each v in adj[n] :
if v.color = WHITE :
DFS-VISIT(G, v)
n.color = BLACKืืืืงื ืืื ืฆืืข ื ืชืื ื ื ืืฆืืช ืขื ืืขืื:
- ืกืืืืืืืช:
O(|V|+|E|)
Is-Edge-On-Cycle(G, e) :
u = e.u
v = e.v
G.removeEdge(e)
BFS(v)
return (u.color โ WHITE)ืืฆืืืช ืืกืคืจ ืจืืืื ืงืฉืืจืืช ืืืจืฃ:
- ืกืืืืืืืช:
O(|V|+|E|)
DFS-Number-Of-Connected-Components(G) :
counter = 0
for each v in V : v.color = WHITE
for each v in V :
if v.color = WHITE :
counter++
DFS-VISIT(G, v)
return counterืืืืงื ืืื ืงืืื ืืขืื ืืืจืฃ:
- ืกืืืืืืืช:
O(|V|+|E|)
DFS-Has-Cycle(G) :
for each v in V : v.color = WHITE
for each v in V :
if v.color = WHITE :
if DFS-VISIT(G, v) = true :
return true
return falseDFS-VISIT(G, n) :
n.color = GRAY
for each v in adj[n] :
if v.color = GRAY :
return true
if v.color = WHITE :
if DFS-VISIT(G, v) = true :
return true
n.color = BLACK
return falseืืืืงื ืืื ืงืืื ืืขืื ืืืืืืจ ืืืจืฃ:
- ืกืืืืืืืช:
O(|V|+|E|)
Has-Euler-Cycle(G) :
for each v in V :
if v.degree % 2 โ 0 :
return "No euler Cycle detected"
if isConnected(G) :
return Euler-Cycle(G)ืืฆืืืช ืืขืื ืืืืืืจ ืืืจืฃ:
- ืกืืืืืืืช:
O(|V|+|E|)
Euler-Cycle(G) :
select some vertex s from G
list C = โ
stack = {s}
while stack โ โ
:
v = stack.peek()
if v.degree = 0 :
C.add(stack.pop())
else :
u = first of adj[v]
stack.push(u)
G.remove(u,v)
G.remove(v,u)
return C ืืืืงืช ืงืฉืืจืืช ืืืจืฃ ืข"ื ืกืจืืงื ืืจืืื:
- ืกืืืืืืืช:
O(|V|+|E|)
BFS-isConnected(G) :
select some vertex s from G
BFS(G, s)
for each v in V :
if v.color โ BLACK :
return false
return true ืืืืงื ืืื ืงืืื ืืกืืื ืืืืืืจ ืืืจืฃ:
- ืกืืืืืืืช:
O(|V|+|E|)
Euler-HasEuler-path(G) :
counter = 0
for each v in V :
if v.degree % 2 โ 0 :
counter++
return isConnected(G) = true AND counter = 2ืืฆืืืช ืงืืืจ, ืจืืืืก ืืืจืืืื ืฉื ืขืฅ ืข"ื ืืืืืจืืชื ืฉืจืืคืช ืขืืื:
- ืกืืืืืืืช:
O(|V|+|E|)
Diameter-Fire(T) :
n = |V|, radius = 0, leaves = โ
for each v in V :
if v.deg = 1 :
leaves.add(v)
while n > 2 :
future = โ
for each leaf in leaves :
leaf.deg = 0
n--
for each v in adj[leaf] :
if --v.deg = 1 :
future.add(v)
radius++
leaves = future
diameter = radius*2 + |leaves|-1
centers[] = leaves
return {centers, radius, diameter}ืืฆืืืช ืงืืืจ ืฉื ืขืฅ ืข"ื ืืืืืจืืชื ืกืจืืงื ืืขืืืง:
- ืกืืืืืืืช:
O(|V|+|E|)
Diameter-DFS(T) :
maxDist = 0, MaxDistVertex = 0
DFS(T, 0)
for each v in V:
if maxDist < v.dist :
maxDist = v.dist
MaxDistVertex = v
DFS(T, MaxDistVertex)
for each v in V:
if maxDist < v.dist :
maxDist = v.dist
return maxDistืืฆืืืช ืืืกืืื ืฉื ืงืืืจ ืืขืฅ ืข"ื ืืืืืจืืชื ืกืจืืงื ืืขืืืง DFS:
- ืกืืืืืืืช:
O(|V|+|E|)
Diameter-Path-DFS(T) :
maxDist = 0, MaxDistVertex = 0
DFS(T, 0)
for each v in V:
if maxDist < v.dist :
maxDist = v.dist
MaxDistVertex = v
DFS(T, MaxDistVertex)
for each v in V:
if maxDist < v.dist :
maxDist = v.dist
MaxDistVertex = v
path = โ
while MaxDistVertex != -1 :
path.add(MaxDistVertex)
MaxDistVertex = MaxDistVertex.prev
return pathืืืืงื ืืื ืงืืืงืื ื ืชืื ื ืืฆื ืขื ืงืืืจ ืืขืฅ:
- ืืืขืื ืืืื ืืืืืงื ืืื ื ืงืืื ื ืืฆืืช ืขื ืฆืืข ืืกืืื.
- ืฉืื ืจืืฉืื: ื ืืฆื ืืช ืืงืืืจ (ืข"ื ืืืืืจืืชื ืฉืจืืคื ืื ืืืืฆืขืืช
DFS) - ืฉืื ืฉื ื: ื ืืฆื ืืช ืืงืืืงืื ืืื ืจืืืง ืืงืืืงืื
v- ืืืืื ืฉืืื ืงืฆื ืืื ืฉื ืืงืืืจ. - ืฉืื ืฉืืืฉื: ื ืืฆื ืืช ืืฆืืข ืืจืืฉืื ื ืืงืืืงืื
vืืืกืืื ืืขืืจ ืืงืืืงืื ืฉืืฆืื ื ืืฉืื ืืงืืื. ื ืฉืืืจ ืืช ืืืจืืง. - ืฉืื ืจืืืขื: ื ืกืืจ ืืช ืืฆืืข ืืืืช ืื ืฉืืขืฆื ืืกืืจ ืืช ืื ืืขื ืฃ
- ืฉืื ืืืืฉื: ื ืขืฉื ืฉืื ืืช ืฉืื 2. ืืืืื ืฉืืคืขื ืืงืืืงืื ืืื ืจืืืง ื
vืืื ืืงืฆื ืืฉื ื ืฉื ืืงืืืจ. - ืฉืื ืืืจืื: ืื ืืงืืืจ ืฉืืื ืืืจืืง ืฉื
vืืืงืฆื ืืจืืฉืื ืฉื ืืงืืืจ ืืขืื ืืจืืงื ืืืงืฆื ืืฉื ื - ืืื ืืงืืืงืื ื ืืฆื ืขื ืืงืืืจ (ืืื ืืื ืืืืื ืืืฉ ืืื) - ืกืืืืืืืช:
O(|V|+|E|)
is-Vertex-on-Diameter(T, v) :
diameter = Diameter(T)
BFS(v)
maxDist1 = maxDistIndex = 0
for each v in V :
if maxDist1 < v.dist :
maxDist1 = v.dist
maxDistIndex = v
while maxDistIndex.prev โ v :
maxDistIndex = maxDistIndex.prev
remove((v, maxDistIndex))
BFS(v)
maxDist2 = 0
for each v in V :
if maxDist2 < v.dist :
maxDist2 = v.dist
return (diameter == maxDist1 + maxDist2)ืืฆืืืช ืืืจืืงืื ืืงืฆืจืื ืืืืชืจ ืืืจืฃ ืืงืืืงืื ื ืชืื:
- ืกืืืืืืืช:
O((V+E)logV)(ืืืฉืจ ืืฉืชืืฉืื ืืขืจืืื ืืื ืืจืืช)
Dijkstra(G, s) :
for v in V : v.dist = โ
s.dist = 0
Q = V
while Q โ โ
:
u = Q.extractMin() //by dists
for v in adj[u] :
if v.dist > u.dist + w(u,v) :
v.dist = u.dist + w(u,v)
v.prev = u- ืฆืจืื ืืืืืง ืงืืื ืฉืืื ืืชืงืืื
Sum(degs) = 2*(|V|-1)ืืคื ื ืฉืืชืืืืื ืืช ืืืืืืจืืชื. - ืกืืืืืืืช:
O(VlogV)ืื ืืืขืจื ืื ืืืืื.O(V)ืื ืืืขืจื ืืืืื ืืืจ. - ืืขืจื: ืืืื ืืงืก ืฉื ืืืืืจ ืืจืืฉืื ืืืขืจื ืืื 0, ืืืื ืืงืก ืฉื ืืืืืจ ืืืืจืื ืืืขืจื ืืื N-1.
GenerateTreebyDegrees(deg[N]) :
sort(deg)
j = 0
while deg[j] = 1 : j++
New Tree[N,N] = {false}
for i=0 to N-2 :
Tree[i,j] = true
Tree[j,i] = true
if --deg[j] = 1 :
j++
Tree[N-2,N-1] = true
Tree[N-1,N-2] = true
return Tree- ืืจืขืืื ืืื ืืืฆืืจ ืืืฆืื ืืื ืืจื ืืืืจืืืช ืืื ืขืฅ. ืื ืืืืจืืืช ืฉื ืืขืฅ ืืจืืฉืื ืืื ืืืืจืืืช ืฉื ืืขืฅ ืืฉื ื, ืืื ืฉื ื ืืขืฆืื ืืืืืืืจืคืืื.
- ืืฆืืจืช ืืืืฆืื ืืืื ืืจื ืืืืจืืืช ืืขืฅ ืืชืืืื ืจืงืืจืกืืืืช ืืืฉืืจืฉ ืืืคื ืืื, ืืืฉืจ ืื ืขืื ืืืืฆื ืข"ื "01" ืืื ืืื ืืฉืจืฉืจ ืืช ืืืืฆืืืื ืฉื ืืืืืื ืฉืื ืืกืืจ ืืืืื ืืืฉืจ ืืฉืืื ืืฉ "0" ืืืืืื ืืฉ "1".
- ืื ืื ื ืชืื ืื ืืฉืืจืฉ ืฉื ืืขืฅ ืื ื ืฉืชืืฉ ืืืืืืจืืชื ืฉืจืืคื ืืืฆืืืช ืืจืื ืืขืฅ ืืืื ืืืื ืืฉืืจืฉ.
- ืื ืืขืฅ ืืจืืฉืื ืืฉ ืืจืื ืืื ืืืฉื ื ืืฉ ืฉื ื ืืจืืืื, ืืื ืืขืฆืื ืื ืืืืืืืจืคืืื.
- ืื ืืฉ 2 ืืจืืืื ืืขืฅ, ื ืืืืง ืื ืืืืจืืืช ืฉื ืืขืฅ ืืจืืฉืื ืฉืืื ืืืืจืืืช ืฉื ืืขืฅ ืืฉื ื ืืืืืืคื ืชืคืงืืืื ืืื ืืืจืืืื ืฉื ืืฆืื.
- ืกืืืืืืืช:
O(VlogV)
AHU-Tree-Isomorphism(T1, T2) :
r1 = T1.root
r2 = T2.root
if r1 = null AND r2 = null :
r1 = findCenter(T1) // by Fire Algorithm
r2 = findCenter(T2)
New global List<String> childrenCodes[|V|]
code1 = findCode(r1)
code2 = findCode(r2)
return (code1 == code2)findCode(u)
u.color = BLACK
if u is a leaf :
return "10"
for each v in adj[u] :
if v.color = WHITE : // then v is child of u
childrenCodes[u].add(findCode(v))
Sort(childrenCodes[u])
temp = ""
for each s in childrenCodes[u] :
temp += s
return "1"+temp+"0"