文章目錄
- 圖論的集合類操作
- Base.getindex
- Base.intersect
- Base.join
- Base.reverse
- Base.reverse!
- Base.size
- Base.sum
- Base.sum
- Base.union
- 圖生成與轉換
- Graphs.cartesian_product`
- Graphs.complement
- Graphs.compute_shifts
- Graphs.crosspath
- Graphs.difference
- Graphs.egonet
- Graphs.induced_subgraph
- Graphs.merge_vertices!
- Graphs.merge_vertices
- Graphs.symmetric_difference
- Graphs.tensor_product
- 其他函數
- SparseArrays.blockdiag
- SparseArrays.sparse
參考鏈接:
https://juliagraphs.org/Graphs.jl/stable/core_functions/operators/
圖論的集合類操作
Base.getindex
方法
g[iter]
返回由 iter 誘導的子圖。等價于 induced_subgraph(g, iter)[1]
。
Base.intersect
方法, 邊的交集
intersect(g, h)
返回一個僅包含同時存在于圖 g和圖 h 中的邊的圖。
實現說明:此函數可能生成度數為 0 的頂點。保留輸入圖的 eltype。
示例
using Graphs
g1 = SimpleDiGraph([0 1 0 0 0; 0 0 1 0 0; 1 0 0 1 0; 0 0 0 0 1; 0 0 0 1 0])
g2 = SimpleDiGraph([0 1 0; 0 0 1; 1 0 0])
foreach(println, edges(intersect(g1, g2)))
Base.join
方法
join(g, h)
返回一個組合圖 g 和 h
的圖(使用 blockdiag),然后添加 g中的頂點與 h 中的頂點之間的所有邊
。
實現說明:保留輸入圖的 eltype。如果生成的圖的頂點數超出 eltype 的范圍,則會報錯。
示例
using Graphs
g = join(star_graph(3), path_graph(2))
println(g) # 輸出: {5, 9} undirected simple Int64 graph
foreach(println, edges(g))
Base.reverse
函數 反向圖
reverse(g)
返回一個有向圖,其中所有邊的方向都與原始有向圖 g` 相反。
實現說明:保留輸入圖的 eltype。
示例
using Graphs
g = SimpleDiGraph([0 1 0 0 0; 0 0 1 0 0; 1 0 0 1 0; 0 0 0 0 1; 0 0 0 1 0])
foreach(println, edges(reverse(g)))
Base.reverse!
函數
reverse!(g)
有向圖 g 的就地反轉(修改原圖)。非修改版本請參見 Base.reverse。
Base.size
方法 頂點數
size(g, i)
如果 i=1 或 i=2
,則返回圖 g` 的頂點數,否則返回 1。
示例
using Graphs
g = cycle_graph(4)
println(size(g, 1)) # 輸出: 4
println(size(g, 2)) # 輸出: 4
println(size(g, 3)) # 輸出: 1
Base.sum
方法 頂點度
sum(g, i)
返回圖的入度(i=1
)或出度(i=2
)值的向量。
示例
using Graphs
g = SimpleDiGraph([0 1 0 0 0; 0 0 1 0 0; 1 0 0 1 0; 0 0 0 0 1; 0 0 0 1 0])
println(sum(g, 2)) # 輸出: [1, 1, 2, 1, 1]
println(sum(g, 1)) # 輸出: [1, 1, 1, 2, 1]
Base.sum
方法 邊數
sum(g)
返回圖 g` 中的邊數。
示例
using Graphs
g = SimpleGraph([0 1 0; 1 0 1; 0 1 0])
println(sum(g)) # 輸出: 2
Base.union
方法 頂點的并,邊的并
union(g, h)
通過取所有頂點和邊的集合并集,返回一個組合圖 g 和 h
的圖。
實現說明:保留輸入圖的 eltype。如果生成的圖的頂點數超出 eltype 的范圍,則會報錯。
示例
using Graphs
g = SimpleGraph(3); h = SimpleGraph(5)
add_edge!(g, 1, 2); add_edge!(g, 1, 3)
add_edge!(h, 3, 4); add_edge!(h, 3, 5); add_edge!(h, 4, 5)
f = union(g, h)
foreach(println, edges(f))
圖生成與轉換
Graphs.cartesian_product`
方法
cartesian_product(g, h)
返回 g 和 h
的笛卡爾積圖。
實現說明:保留輸入圖的 eltype。如果生成的圖的頂點數超出 eltype 的范圍,則會報錯。
示例
using Graphs
g = cartesian_product(star_graph(3), path_graph(3))
println(g) # 輸出: {9, 12} undirected simple Int64 graph
foreach(println, edges(g))
Graphs.complement
方法
complement(g)
返回圖 g` 的補圖。
實現說明:保留輸入圖的 eltype。
示例
using Graphs
g = SimpleDiGraph([0 1 0 0 0; 0 0 1 0 0; 1 0 0 1 0; 0 0 0 0 1; 0 0 0 1 0])
foreach(println, edges(complement(g)))
Graphs.compute_shifts
方法
compute_shifts(n::Int, x::AbstractArray)
確定 x 中的所有元素中有多少個小于 i
,i
從 1 到 n
。
Graphs.crosspath
函數
crosspath(len::Integer, g::Graph)
返回一個將圖 g 重復 len
次的圖,并通過路徑將每個頂點與其副本連接起來。
實現說明:保留輸入圖的 eltype。如果生成的圖的頂點數超出 eltype 的范圍,則會報錯。
示例
using Graphs
g = crosspath(3, path_graph(3))
println(g) # 輸出: {9, 12} undirected simple Int64 graph
foreach(println, edges(g))
Graphs.difference
方法
difference(g, h)
返回一個圖,其邊在圖 g 中但不在圖 h
中。
實現說明:此函數可能會生成具有 0 度頂點的圖。保留輸入圖的 eltype。
示例
using Graphs
g1 = SimpleDiGraph([0 1 0 0 0; 0 0 1 0 0; 1 0 0 1 0; 0 0 0 0 1; 0 0 0 1 0])
g2 = SimpleDiGraph([0 1 0; 0 0 1; 1 0 0])
foreach(println, edges(difference(g1, g2)))
Graphs.egonet
方法
egonet(g, v, d, distmx=weights(g))
返回由距離頂點 v 為 d
的鄰居誘導的子圖,使用可選的權重 distmx(默認使用 weights(g)
)。這等價于 induced_subgraph(g, neighborhood(g, v, d, dir=dir))[1]`。
可選參數
- dir=:out
:如果 g
是有向圖,此參數指定相對于 v的邊方向(即 :in
或 :out`)。
Graphs.induced_subgraph
方法
induced_subgraph(g, vlist)
induced_subgraph(g, elist)
返回由頂點列表 vlist 或邊列表 elist
誘導的圖 g 的子圖,以及一個將新頂點映射回舊頂點的向量 vmap
(子圖中的頂點 i 對應于原始圖中的頂點 vmap[i]
)。
返回的圖有 length(vlist) 個頂點,新頂點 i
對應于原始圖中 vlist 的第 i
個頂點。
使用示例
using Graphs
g = complete_graph(10)
sg, vmap = induced_subgraph(g, 5:8)
println(nv(sg)) # 輸出: 4
println(ne(sg)) # 輸出: 6
println(vm[4]) # 輸出: 8sg, vmap = induced_subgraph(g, [2,8,3,4])
println(sg == g[[2,8,3,4]]) # 輸出: trueelist = [Edge(1,2), Edge(3,4), Edge(4,8)]
sg, vmap = induced_subgraph(g, elist)
println(sg == g[elist]) # 輸出: true
Graphs.merge_vertices!
方法
merge_vertices!(g, vs)
將 vs 中指定的頂點合并為單個頂點,其索引將是 vs
中的最小值。所有連接到 vs` 中頂點的邊都將連接到新的合并頂點。
返回一個向量,其中新頂點值由原始頂點索引索引。
實現說明:僅支持 SimpleGraph`。
示例
using Graphs
g = path_graph(5)
foreach(println, edges(g)) # 輸出原始邊
vmap = merge_vertices!(g, [2, 3])
println(vmap) # 輸出新頂點映射
foreach(println, edges(g)) # 輸出合并后的邊
Graphs.merge_vertices
方法
merge_vertices(g::AbstractGraph, vs)
創建一個新圖,其中 vs 中的所有頂點都被別名為同一個頂點 minimum(vs)
。
示例
using Graphs
g = path_graph(5)
foreach(println, edges(g)) # 輸出原始邊
h = merge_vertices(g, [2, 3])
foreach(println, edges(h)) # 輸出新圖的邊
Graphs.symmetric_difference
方法
symmetric_difference(g, h)
返回一個圖,其邊來自圖 g 但不在圖 h
中,或來自圖 h 但不在圖 g
中。
實現說明:此函數可能會生成包含 0 度頂點的圖。保留輸入圖的 eltype。如果生成的圖的頂點數超出 eltype 的范圍,則會報錯。
示例
using Graphs
g = SimpleGraph(3); h = SimpleGraph(3)
add_edge!(g, 1, 2)
add_edge!(h, 1, 3); add_edge!(h, 2, 3)
f = symmetric_difference(g, h)
foreach(println, edges(f))
Graphs.tensor_product
方法
tensor_product(g, h)
返回 g 和 h
的張量積圖。
實現說明:保留輸入圖的 eltype。如果生成的圖的頂點數超出 eltype 的范圍,則會報錯。
示例
using Graphs
g = tensor_product(star_graph(3), path_graph(3))
println(g) # 輸出: {9, 8} undirected simple Int64 graph
foreach(println, edges(g))
其他函數
SparseArrays.blockdiag
方法
blockdiag(g, h)
返回一個具有 |V(g)| + |V(h)| 個頂點和 |E(g)| + |E(h)|
條邊的圖,其中圖 h 的頂點和邊附加到圖 g
。
實現說明:保留輸入圖的 eltype。如果生成的圖的頂點數超出 eltype 的范圍,則會報錯。
示例
using Graphs
g1 = SimpleDiGraph([0 1 0 0 0; 0 0 1 0 0; 1 0 0 1 0; 0 0 0 0 1; 0 0 0 1 0])
g2 = SimpleDiGraph([0 1 0; 0 0 1; 1 0 0])
g = blockdiag(g1, g2)
println(g) # 輸出: {8, 9} directed simple Int64 graph
foreach(println, edges(g))
SparseArrays.sparse
方法
sparse(g)
返回圖 g` 的默認鄰接矩陣。