Получить топологический порядок графа из матрицы смежности - PullRequest
0 голосов
/ 19 октября 2018

Для данной матрицы смежности я хотел бы получить топологический порядок графа в качестве вывода в Python.Например что-то вроде этого:

In[1]: a = np.array([[1,1,0,0],[0,1,0,0],[1,0,1,1],[0,1,0,1]])
In[1]: topoOrder(a)
Out[1]: array([[3, 1, 4, 2]])

У вас есть какие-либо рекомендации?

1 Ответ

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

Я думаю, что http://py -algorithm.blogspot.com / 2011/09 / blog-post.html достаточно информации о топологической сортировке.

Например, для сортировки матрицы естьесть такая реализация:

 class Graph:
    def __init__(self):
        self.nodes=[[0,0,0,0,0,0],
                    [1,0,0,1,0,0],
                    [0,1,0,1,0,0],
                    [0,0,0,0,0,0],
                    [0,0,0,1,0,0]
                    ];
        self.count=range(len(self.nodes))

    def GetInputNodesArray(self):
        array = []
        for i in self.count: 
            step=0
            for j in self.count:
                if self.nodes[i][j]==1:step+=1
            array.insert(i,step)
        return array;

    def TopologicSort(self):
        levels =[];
        workArray = self.GetInputNodesArray();
        completedCounter = 0;
        currentLevel = 0;
        while (completedCounter != len(self.nodes)):
            for i in self.count:
                if (workArray[i] == 0):
                    ind=0
                    #добавляем обработанную вершину
                    levels.insert(completedCounter,i);
                    for node in self.nodes:
                        if node[i]==1:
                            workArray[ind]-=1
                        ind+=1

                    workArray[i] = -1; # Помечаем вершину как обработанную
                    completedCounter+=1;
            currentLevel+=1;
        levels.reverse()
        return levels#осталось выбрать в обратном порядке

Это по-русски, так что вы можете перевести это, но я думаю, что алгоритмы должны быть достаточно ясными.

...