第一个简单数据
m <- read.table(row.names = 1, header = TRUE, text =
" A B C D E F
A 0 1 1 1 1 5
B 1 0 1 1e2 1e2 1
C 1 1 0 1 1 1
D 1 1e2 1 0 1e2 1
E 1 1e2 1 1e2 0 1
F 5 1 1 1 1 0")
m <- as.matrix(m)
使用igraph库
ig <- graph.adjacency(m, mode = "undirected", weighted = TRUE, diag = FALSE)
sp <- shortest.paths(ig, algorithm = "dijkstra")
plot(ig)
spaths <- lapply(V(ig),
function(v){
all_shortest_paths(ig, v,
weight = 1 / E(ig)$weight
)
}
)
现在让我们检查到所有顶点spaths $ C $ res或spaths $ B $ res的路径...如何在图形上仅显示从一个点到另一点的最短路径? 1.例如从C到A为红线2.从C到A为蓝线的最长路径
答案 0 :(得分:3)
我将假设您想要从C到A的最长 simple 路径。由于图形具有循环,因此如果您重新访问节点,路径的长度将任意设置。首先让我回答这个问题,但最后有一个警告。
您可以使用all_simple_paths
获取从C到A的所有简单路径。从这些中,很容易选择最短路径之一和最长路径之一。然后给它们上色。
Simple = all_simple_paths(ig, "C", "A")
SP = which.min(sapply(Simple, length))
LP = which.max(sapply(Simple, length))
EL1 = rep(Simple[[LP]], each=2)[-1]
EL1 = EL1[-length(EL1)]
EL2 = rep(Simple[[SP]], each=2)[-1]
EL2 = EL2[-length(EL2)]
ECol = rep("gray", ecount(ig))
ECol[get.edge.ids(ig, EL1)] = "blue"
ECol[get.edge.ids(ig, EL2)] = "red"
plot(ig, edge.color=ECol)
但是要警告!如果您的图很大且连接良好,则两个节点之间可能有许多条路径。 all_simple_paths
可能需要很长时间才能运行并产生非常大的结果。