도표의 연결 분량(열거변)
gonum/graph를 사용하여 차트의 연결 성분 (= 하위 차트) 내 가장자리를 열거했습니다.이 도표는 비directed multigraph로 가장자리에 여러 개lines가 있다.
DepthFirst.EdgeFilter()
전달edgeFunc()
, 하위 도표 단위로 모든 것lineID
을 열거한다.$ go run walkFrom.go
input undirected lines: [[0 1] [1 2] [2 3] [3 0] [0 2] [1 3] [1 0] [4 4] [4 4]]
total 9 lines
lineID ! edge
----------------
2 0 [2 3]
1 1 [1 2]
5 2 [1 3]
0 3 [0 1]
6 3 [0 1]
3 4 [0 3]
4 5 [0 2]
----------------
8 6 [4 4]
7 6 [4 4]
----------------
walkFrom.gopackage main
import (
"fmt"
"gonum.org/v1/gonum/graph"
"gonum.org/v1/gonum/graph/multi"
"gonum.org/v1/gonum/graph/traverse"
)
var iEdge int
func printLine(lID, mID, nID int64, iEdge int) {
fmt.Printf("%d %d [%d %d]\n", lID, iEdge, mID, nID)
}
func printHeader() {
iEdge = 0
fmt.Printf("\nlineID ! edge\n")
printSeparator()
}
func printSeparator() {
fmt.Print("----------------\n")
}
func printLines(e graph.Edge) {
mID, nID := e.From().ID(), e.To().ID()
if mID > nID {mID, nID = nID, mID}
l := e.(graph.Lines)
for l.Next() {
printLine(l.Line().ID(), mID, nID, iEdge)
}
iEdge++
}
func makeWalker(edgeFunc func (graph.Edge)) (walker traverse.DepthFirst) {
walker.EdgeFilter = func(e graph.Edge) bool {
if e.From().ID() <= e.To().ID() {
edgeFunc(e)
}
return true
}
return walker
}
func walk(g *multi.UndirectedGraph, walker *traverse.DepthFirst, from graph.Node) {
if !walker.Visited(from) && g.From(from.ID()).Next() { // neither visited nor isolated node
walker.Walk(g, from, nil)
printSeparator()
}
}
func walkAll(g *multi.UndirectedGraph) {
printHeader()
nod := g.Nodes()
w := makeWalker(printLines)
for nod.Next() {
walk(g, &w, nod.Node())
}
}
func makeGraph() *multi.UndirectedGraph {
IDMAX := 9
inputLines := [][]int64{{0, 1}, {1, 2}, {2, 3}, {3, 0}, {0, 2}, {1, 3}, {1, 0}, {4, 4}, {4, 4}}
g := multi.NewUndirectedGraph()
for i := 0; i <= IDMAX; i++ {
g.AddNode(multi.Node(int64(i)))
}
fmt.Print("input undirected lines: [")
for i, e := range inputLines {
g.SetLine(g.NewLine(g.Node(e[0]), g.Node(e[1])))
fmt.Print(e)
if i < len(inputLines)-1 {fmt.Print(" ")}
}
fmt.Printf("]\ntotal %d lines\n", len(inputLines))
return g
}
func main() {
g:= makeGraph()
walkAll(g)
}
Reference
이 문제에 관하여(도표의 연결 분량(열거변)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kkdd/items/615c19226f30e86e79d3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)