Utilisation de la pile DFS + pour réaliser un tri topologique

Utilisation de la pile DFS + pour réaliser un tri topologique

Dans le processus DFS, lorsqu'il atteint le bas, il est poussé sur la pile, puis le nœud actuel est poussé sur la pile après récursivité.

class Solution {
      Stack<Integer> stack = new Stack<Integer>();
    boolean flag[] ;
    int []result;
    Map<Integer,List<Integer>> map =new HashMap<Integer,List<Integer>>();
    void init(int numCourses, int[][] prerequisites)//prerequisites参见(LeedCode课程表)
    {
        flag =  new boolean[numCourses];//标记节点是否访问
        result = new int[numCourses];//保存拓扑序列
        for(int i=0;i<numCourses;i++)
        {
            map.put(i,new ArrayList<Integer>());
        }
        for(int i=0;i<prerequisites.length;i++)
        {
            map.get(prerequisites[i][1]).add(prerequisites[i][0]);//利用领接列表保存节点
        }
    }
    public int[] findOrder(int numCourses, int[][] prerequisites) {
        if(numCourses==0)
            return new int[0];
        init(numCourses, prerequisites);
        for(int i=0;i<numCourses;i++)
        {
          BFS_Stack(i);
        }
        int track=0;
        while(!stack.isEmpty())
        {
            result[track++]=stack.pop();
        }
        return result;
    }

    void  BFS_Stack(Integer start)
    {
        if(flag[start])//已经访问
            return;
        else if(map.get(start).size()==0)//到达最底部,由于需要入栈,所以需要这一步
        {
            stack.add(start);
            flag[start]=true;
            return;
        }
        else
        {
            flag[start]=true;//标记节点已经访问
            for(int i=0;i<map.get(start).size();i++)
            {
                BFS_Stack(map.get(start).get(i));
            }
            stack.add(start);
        }
        return ;
    }
}
Publié 28 articles originaux · loué 0 · visites 619

Je suppose que tu aimes

Origine blog.csdn.net/qq_44932835/article/details/105423039
conseillé
Classement