• 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







  • 相关阅读:
    有关获取session属性时报nullPointException(空指针异常)的解决方案
    常用的正则表达式集锦
    使用java实现持续移动的小球
    Java基础系列--包装类
    java中关于类的封装与继承,this、super关键字的使用
    简单了解static
    【01】npm/cnpm安装
    【转】Nodejs学习笔记(二)--- 模块
    【转】Nodejs学习笔记(一)--- 简介及安装Node.js开发环境
    【转】axios的基本使用
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564085.html
Copyright © 2020-2023  润新知