Найти все пути из вершины, пока не останется прямых наследников - PullRequest
0 голосов
/ 10 октября 2018

Я работаю над приложением, которое имитирует рабочий процесс в виде графика.Я использую Scala-Graph для достижения этой цели, и я хочу выяснить все возможные пути прямого ребра, пока больше не будет прямых преемников.

Например, для этого графа:

val z = Graph(1~>2, 2~>3, 2~>4, 3~>4, 5~>4)

Я хотел бы найти все возможные пути от вершина 1 до вершин без прямых связей.Таким образом, вывод логики должен быть похож на

1~>2~>3~>4
2~>4

Основные вопросы:

  1. Существует ли собственный scala-graph API для достижения этой цели?
  2. Должен ли я написать метод обхода клиента?

Что касается вопроса 2, я написал первоначальную версию кода для его достижения, но он всегда возвращает пустое значение; (Буду признателен за некоторые отзывыи на этом тожеz равно

[
  [1~2, 2~3, 3~4]
  [2~4]
]

Почему пользовательский метод возвращает пустой список?

1 Ответ

0 голосов
/ 12 октября 2018

Итак, я написал это для достижения этого

// Example graph 1
val z = Graph(1~>2, 2~>3, 2~>4, 3~>4, 5~>4)
// Example graph 2
val z1 = Graph(1~>2, 2~>3, 2~>4, 3~>4, 4~>6, 6~>7, 5~>4)

def getAllPaths(g: z1.NodeT, paths: List[z1.NodeT]): List[Any] = {
  val directs = g.diSuccessors.toList

      if (directs.length == 0) {
          // No more direct successor left, return the array itself
        paths
      } else if (directs.length == 1) {
        // Node with single direction, simply returns itself
        if (paths.length == 0) {
          // appends g itself and its direct successor for the first iteration
          getAllPaths(directs(0), paths :+ g :+ directs(0))
        } else {
          // Appends only the direct successor
          getAllPaths(directs(0), paths :+ directs(0))
        }
      } else {
        directs.map(d => {
          getAllPaths(d, paths :+ d)
        })
      }
    }
val accum = List[z1.NodeT]()

println(getAllPaths(z1.get(1), accum))

// Results in: List(List(1, 2, 3, 4, 6, 7), List(1, 2, 4, 6, 7))

Оставьте это здесь на всякий случай, если кто-то заинтересован в решении той же проблемы!

Также, пожалуйста, помогите мненапиши более элегантно ;) .. Я все еще новичок в Scala

Последующие вопросы:

  • Как мне ссылаться на тип NodeT без прохождения через переменнуюкак в примере выше, который обращается к нему через z1.NodeT?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...