算法笔记
1.利用dfs对DAG拓扑排序
当从某顶点v出发的DFS搜索完成时,v的所有后继顶点必定均已被访问过(想像它们均已被删除),此时的v相当于是无后继的顶点,因此在DFS算法返回之前输出顶点v即可得到 DAG的逆拓扑序列。
模板(算法竞赛入门经典):
int g[N][N]; int vis[N]; int topo[N]; int t,n; bool dfs(int u) { vis[u]=-1; for(int v=0;v<n;v++) if(g[u][v]) { if(vis[v]<0)return false;//存在有向环,失败退出 else if(!vis[v]&&!dfs(v))return false; } vis[u]=1; topo[t--]=u; return true; } bool toposort() { t=n-1; mem(vis,0); for(int u=0;u<n;u++) if(!vis[u]&&!dfs(u))return false; return true; }
2.队列实现拓扑排序,明显好理解
以下是判环版
bool topo_sort(int n){ q.clear(); int cnt=0; for(int i=1;i<=n;i++){ if(tin[i]==0)cnt++,q.push(i); } while(!q.empty()){ int u=q.front(); q.pop(); for(int v:g[u]){ tin[v]--; if(tin[v]==0)cnt++,q.push(v); } } return cnt==n; }