挑战程序设计竞赛(算法和数据结构)——15.2拓扑排序(dfs,bfs)的JAVA实现

Posted 小乖乖的臭坏坏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了挑战程序设计竞赛(算法和数据结构)——15.2拓扑排序(dfs,bfs)的JAVA实现相关的知识,希望对你有一定的参考价值。

题目:

代码:

import java.util.*;

public class TopologicalSort 
    public static void main(String[] args) 
        Scanner cin = new Scanner(System.in);
        int N = cin.nextInt();
        boolean V[] = new boolean[N];
        for (int i=0;i<N;i++)
            V[i] = false;
        
        int indegree[] = new int[N];
        ArrayList<Integer> A[] = new ArrayList[N];
        for (int i=0;i<N;i++)
            A[i] = new ArrayList<>();
        
        int M = cin.nextInt();
        for (int i=0;i<M;i++)
            int s = cin.nextInt();
            int t = cin.nextInt();
            indegree[t]++;
            A[s].add(t);
        

        LinkedList<Integer> out = myTopologicalSort(V, indegree, N, A);
        for (int element : out)
            System.out.println(element);
        
    

    public static LinkedList<Integer> myTopologicalSort(boolean[] V, int[] indegree, int n, ArrayList<Integer> A[])
        LinkedList<Integer> out = new LinkedList<>();
        String mode = "dfs";
        if(mode.equals("bfs"))
            for (int u=0;u<n;u++)
                if(indegree[u]==0 && !V[u])
                    out = bfs(u, V, indegree, out, A);//对于所有节点中的每一个节点运用bfs算法
                
            
        else if(mode.equals("dfs"))
            for (int s = 0; s <n; s++)
                if(!V[s])
                    out = dfs(s, V, out, A);
                
            
            Collections.reverse(out);
        

        return out;
    

    public static LinkedList<Integer> dfs(int u, boolean[] V, LinkedList<Integer> out, ArrayList<Integer> A[])
        V[u] = true;
        for (int i = 0; i<A[u].size(); i++)
            int v = A[u].get(i);//u的邻接点
            if(!V[v])
                dfs(v, V, out, A);
            
        
        out.add(u);
        return out;
    

    public static LinkedList<Integer> bfs(int s, boolean[] V, int[] indegree, LinkedList<Integer> out, ArrayList<Integer> A[])
        Queue<Integer> Q;
        Q = new ArrayDeque();
        //将当前节点设为处理中状态
        Q.add(s);
        V[s] = true;
        //只要Q队列不为空就执行循环操作,广度搜索
        while(Q.size()!=0)
            int u;
            //只有队头元素的入度为0时,才可以将其添加至out
            u = Q.remove();
            V[u] = true;
            //删除Q的队头元素,并将队头元素赋给out
            out.add(u);

            //对于第u个节点的所有出度
            for (int i=0;i<A[u].size();i++)
                int v = A[u].get(i);//u的邻接点
                indegree[v]--;
                //如果v的入度为0且还没有被处理过
                if(indegree[v]==0 && !V[v])
                    V[v] = true;
                    Q.add(v);
                
            
        

        return out;
    

输入:

6 6
0 1
1 2
3 1
3 4
4 5
5 2

bfs输出:

0
3
1
4
5
2

dfs输出:

3
4
5
0
1
2

以上是关于挑战程序设计竞赛(算法和数据结构)——15.2拓扑排序(dfs,bfs)的JAVA实现的主要内容,如果未能解决你的问题,请参考以下文章

挑战程序设计竞赛(算法和数据结构)——分割(下)&快速排序的JAVA实现

挑战程序设计竞赛(算法和数据结构)——19.2九宫格拼图问题的JAVA实现

挑战程序设计竞赛(算法和数据结构)——7.1归并排序JAVA实现

挑战程序设计竞赛(算法和数据结构)——16.13线段相交问题(曼哈顿算法)的JAVA实现

挑战程序设计竞赛(算法和数据结构)——3.6希尔排序的JAVA实现

挑战程序设计竞赛(算法和数据结构)——3.6希尔排序的JAVA实现