在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。且该序列必须满足下面两个条件:
- 每个顶点出现且只出现一次。
- 若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。
只有有向无环图才有拓扑排序,另外的图没有拓扑排序一说。
ps:对于拓扑排序来说,判断是否是有向无环图是关键。
拓扑排序的两种写法: 1.深度优先搜索的模板写法(dfs):#include2.广度优先搜索德写法(bfs):using namespace std; int n,m; //建边,每个顶点能到哪些点:G[0]={1,2,3}代表 0 能到 1,2,3这些顶点 vector G[20]; //用来标记顶点的状态:0-->未访问;1-->已访问;-1-->正在访问; int vis[20]; vector ans; // 判断是否可以进行拓扑排序 void init(){ for(int i=1;i<=n;i++){ g[i].clear; vis[i]=0; } } bool dfs(int x){ //标记x点正在被访问; vis[x]=-1; //通过x点,判断下一个点是否可到,进行遍历 for(int i=0;i >n>>m){ init(); for(int i=0;i >a>>b; G[a].push_back(b); } if(!topo_sort()){ cout<<"-1"< =0;i--){ cout<
广搜拓扑写法居多(从入度和出度的角度考虑)。
#includeusing namespace std; int n,m; vector G[20]; int in[20]; void init(){ for(int i=1;i<=n;i++){ G[i].clear(); in[i]=0; } } int main(){ while(cin>>n>>m){ init(); for(int i=0;i >a>>b; G[a].push_back(b); //b入度增加 in[b]++; } queue q; int sum=n; //将所有入度为零的点加入到队列中 for(int i=1;i<=n;i++){ if(in[i]==0){ q.push(i); sum--; } } vector ans; //广搜跑拓扑排序 while(!q.empty()){ int len=q.size(); for(int i=0;i



