Topological Sorting(拓扑排序)

来源:互联网 发布:张家界玻璃桥网络购票 编辑:程序博客网 时间:2024/05/23 20:04

程序来源: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 graphclass 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 topologicalSortvoid 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 functionsint 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 \n";    g.topologicalSort();     return 0;}

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

Java程序如下:
// A Java program to print topological sorting of a DAGimport java.io.*;import java.util.*; // This class represents a directed graph using adjacency// list representationclass 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 DAGfrom collections import defaultdict #Class to represent a graphclass 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







0 0