- 木のグラフがある
- ノードに値が与えられている
- 木の上で、この値が順序よく並んでいるのかを評価したい
- そのために、次のようにする
- ノードの並びのうち、値が昇順(降順でもよい)になっている鎖状のセグメントに分割する
- そのセグメントを1つのノードとみたてて、それらが作る木として、元の木グラフをとらえる
- セグメントの連結にあたっては、隣接セグメントを定めるほかに、セグメントの最小端と最大端とを区別する必要がある
- 具体的には、2セグメントを連結する場合には、第1セグメントの最小端と第2セグメントの最小端が連結する場合、第1セグの最小端と第二セグの最大端、第1セグの最大端と第2セグの最小端、第1セグの最大端と第2セグの最大端とが連結する4つの場合がある
- ノードの連結の具合が1通りのグラフは無向グラフ、2通りのグラフは有向グラフ。この場合は、4通りの連結の仕方のあるグラフということになる
- そんなのをRでハンドリングするための覚書き
library(igraph)
N<-3
M<-matrix(0,N,N)
for(i in 1:(N-2)){
M[i,sample((i+1):N,1)]<-1
}
M[N-1,N]<-1
M
s<-sample(1:N)
M<-M[s,s]
M
M2<-(M+t(M))
M2[lower.tri(M2)]<-0
M2
g<-graph.adjacency(M)
is.connected(g,"strong")
plot(g)
L<-sample(2:5,N,replace=TRUE)
AllN<-sum(L)
V<-sample(1:AllN)
minMax<-matrix(0,N,2)
st<-1
end<-0
Segs<-list()
Mall<-matrix(0,AllN,AllN)
for(i in 1:N){
end<-st+L[i]-1
Segs[[i]]<-sort(V[st:end])
minMax[i,]<-range(Segs[[i]])
st<-end+1
for(j in 1:(length(Segs[[i]])-1)){
Mall[Segs[[i]][j],Segs[[i]][j+1]]<-1
}
}
minMax
Segs
M2<-M*sample(c(-1,1),N^2,replace=TRUE)
M2
for(i in 1:N){
for(j in 1:N){
if(M[i,j]==1){
Mall[minMax[i,1],minMax[j,1]]<-1
}else if(M[i,j]==-1){
Mall[minMax[i,1],minMax[j,2]]<-1
}
}
}
diag(Mall)<-0
Mall
Mall<-(Mall+t(Mall))
Mall[lower.tri(Mall)]<-0
Mall
g<-graph.adjacency(Mall)
is.connected(g,"weak")
plot(g)