• Topological Sorting(拓扑排序)


    程序来源:Topological Sorting

    C++程序如下:

    // A C++ program to print topological sorting of a DAG
    #include<iostream>
    #include <list>
    #include <stack>
    using namespace std;
     
    // Class to represent a graph
    class Graph
    {
        int V;    // No. of vertices'
     
        // Pointer to an array containing adjacency listsList
        list<int> *adj;
     
        // A function used by topologicalSort
        void topologicalSortUtil(int v, bool visited[], stack<int> &Stack);
    public:
        Graph(int V);   // Constructor
     
         // function to add an edge to graph
        void addEdge(int v, int w);
     
        // prints a Topological Sort of the complete graph
        void topologicalSort();
    };
     
    Graph::Graph(int V)
    {
        this->V = V;
        adj = new list<int>[V];
    }
     
    void Graph::addEdge(int v, int w)
    {
        adj[v].push_back(w); // Add w to v’s list.
    }
     
    // A recursive function used by topologicalSort
    void Graph::topologicalSortUtil(int v, bool visited[], 
                                    stack<int> &Stack)
    {
        // Mark the current node as visited.
        visited[v] = true;
     
        // Recur for all the vertices adjacent to this vertex
        list<int>::iterator i;
        for (i = adj[v].begin(); i != adj[v].end(); ++i)
            if (!visited[*i])
                topologicalSortUtil(*i, visited, Stack);
     
        // Push current vertex to stack which stores result
        Stack.push(v);
    }
     
    // The function to do Topological Sort. It uses recursive 
    // topologicalSortUtil()
    void Graph::topologicalSort()
    {
        stack<int> Stack;
     
        // Mark all the vertices as not visited
        bool *visited = new bool[V];
        for (int i = 0; i < V; i++)
            visited[i] = false;
     
        // Call the recursive helper function to store Topological
        // Sort starting from all vertices one by one
        for (int i = 0; i < V; i++)
          if (visited[i] == false)
            topologicalSortUtil(i, visited, Stack);
     
        // Print contents of stack
        while (Stack.empty() == false)
        {
            cout << Stack.top() << " ";
            Stack.pop();
        }
    }
     
    // Driver program to test above functions
    int main()
    {
        // Create a graph given in the above diagram
        Graph g(6);
        g.addEdge(5, 2);
        g.addEdge(5, 0);
        g.addEdge(4, 0);
        g.addEdge(4, 1);
        g.addEdge(2, 3);
        g.addEdge(3, 1);
     
        cout << "Following is a Topological Sort of the given graph 
    ";
        g.topologicalSort();
     
        return 0;
    }

    程序运行结果(下同):
    Following is a Topological Sort of the given graph
    5 4 2 3 1 0

    Java程序如下:
    // A Java program to print topological sorting of a DAG
    import java.io.*;
    import java.util.*;
     
    // This class represents a directed graph using adjacency
    // list representation
    class Graph
    {
        private int V;   // No. of vertices
        private LinkedList<Integer> adj[]; // Adjacency List
     
        //Constructor
        Graph(int v)
        {
            V = v;
            adj = new LinkedList[v];
            for (int i=0; i<v; ++i)
                adj[i] = new LinkedList();
        }
     
        // Function to add an edge into the graph
        void addEdge(int v,int w) { adj[v].add(w); }
     
        // A recursive function used by topologicalSort
        void topologicalSortUtil(int v, boolean visited[],
                                 Stack stack)
        {
            // Mark the current node as visited.
            visited[v] = true;
            Integer i;
     
            // Recur for all the vertices adjacent to this
            // vertex
            Iterator<Integer> it = adj[v].iterator();
            while (it.hasNext())
            {
                i = it.next();
                if (!visited[i])
                    topologicalSortUtil(i, visited, stack);
            }
     
            // Push current vertex to stack which stores result
            stack.push(new Integer(v));
        }
     
        // The function to do Topological Sort. It uses
        // recursive topologicalSortUtil()
        void topologicalSort()
        {
            Stack stack = new Stack();
     
            // Mark all the vertices as not visited
            boolean visited[] = new boolean[V];
            for (int i = 0; i < V; i++)
                visited[i] = false;
     
            // Call the recursive helper function to store
            // Topological Sort starting from all vertices
            // one by one
            for (int i = 0; i < V; i++)
                if (visited[i] == false)
                    topologicalSortUtil(i, visited, stack);
     
            // Print contents of stack
            while (stack.empty()==false)
                System.out.print(stack.pop() + " ");
        }
     
        // Driver method
        public static void main(String args[])
        {
            // Create a graph given in the above diagram
            Graph g = new Graph(6);
            g.addEdge(5, 2);
            g.addEdge(5, 0);
            g.addEdge(4, 0);
            g.addEdge(4, 1);
            g.addEdge(2, 3);
            g.addEdge(3, 1);
     
            System.out.println("Following is a Topological " +
                               "sort of the given graph");
            g.topologicalSort();
        }
    }
    // This code is contributed by Aakash Hasija


    Python程序如下:
    #Python program to print topological sorting of a DAG
    from collections import defaultdict
     
    #Class to represent a graph
    class Graph:
        def __init__(self,vertices):
            self.graph = defaultdict(list) #dictionary containing adjacency List
            self.V = vertices #No. of vertices
     
        # function to add an edge to graph
        def addEdge(self,u,v):
            self.graph[u].append(v)
     
        # A recursive function used by topologicalSort
        def topologicalSortUtil(self,v,visited,stack):
     
            # Mark the current node as visited.
            visited[v] = True
     
            # Recur for all the vertices adjacent to this vertex
            for i in self.graph[v]:
                if visited[i] == False:
                    self.topologicalSortUtil(i,visited,stack)
     
            # Push current vertex to stack which stores result
            stack.insert(0,v)
     
        # The function to do Topological Sort. It uses recursive 
        # topologicalSortUtil()
        def topologicalSort(self):
            # Mark all the vertices as not visited
            visited = [False]*self.V
            stack =[]
     
            # Call the recursive helper function to store Topological
            # Sort starting from all vertices one by one
            for i in range(self.V):
                if visited[i] == False:
                    self.topologicalSortUtil(i,visited,stack)
     
            # Print contents of stack
            print stack
     
    g= Graph(6)
    g.addEdge(5, 2);
    g.addEdge(5, 0);
    g.addEdge(4, 0);
    g.addEdge(4, 1);
    g.addEdge(2, 3);
    g.addEdge(3, 1);
     
    print "Following is a Topological Sort of the given graph"
    g.topologicalSort()
    #This code is contributed by Neelam Yadav







  • 相关阅读:
    Flutter form 的表单 input
    FloatingActionButton 实现类似 闲鱼 App 底部导航凸起按钮
    Flutter 中的常见的按钮组件 以及自 定义按钮组件
    Drawer 侧边栏、以及侧边栏内 容布局
    AppBar 自定义顶部导航按钮 图标、颜色 以及 TabBar 定义顶部 Tab 切换 通过TabController 定义TabBar
    清空路由 路由替换 返回到根路由
    应对ubuntu linux图形界面卡住的方法
    [转] 一块赚零花钱
    [转]在树莓派上搭建LAMP服务
    ssh保持连接
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564086.html
Copyright © 2020-2023  润新知