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
- 拓扑排序(Topological Sorting)
- 拓扑排序(topological sorting)
- 拓扑排序(Topological Sorting)
- 拓扑排序(Topological Sorting)
- Topological Sorting(拓扑排序)
- 拓扑排序(Topological Sorting)
- 拓扑排序(Topological Sorting)
- 拓扑排序(Topological Sorting)
- 拓扑排序(Topological Sorting)
- 拓扑排序Topological Sorting
- (拓扑排序)DZY Loves Topological Sorting
- 拓扑排序(topological sorting)时间复杂度
- Topological Sorting(拓扑排序必考题)
- 拓扑排序(Topological Sorting)算法
- 127.Topological Sorting-拓扑排序(中等题)
- 拓扑排序(Topological Sort)
- 拓扑排序(Topological Sort)
- 拓扑排序(topological-sort)
- C++11的右值引用(一)——左值(lvalue),纯右值(prvalue)和将亡值(xvalue)
- css布局之浮动模型&&左右两栏自适应布局
- C++11 并发指南六(atomic 类型详解三 std::atomic (续))
- POJ 3628 Bookshelf 2(0-1背包)
- 3dMax9 注册机使用
- Topological Sorting(拓扑排序)
- tomcat服务器报NullPointerException,tomcat域名配置
- C++11 并发指南六(atomic 类型详解四 C 风格原子操作介绍)
- 被动回调接口
- PAT甲级1031. Hello World for U (20)
- [MySQL]--查询性能优化
- Ubuntu16.04+Cuda8.0+Caffe+ Opencv3.2+Matlab2015b的配置、安装与编译(四)
- Illustrator的使用经验
- Redis学习--存储的数据结构命令相关