最近刷了几题拓扑排序的题,记录一下拓扑排序
在有向图中,并且按照一定的规则(题目所给的规则)排序。如果图中出现了有向环的话就无法排序了。
1 int gap[maxn][maxn];//记录下有向边 2 int topo[maxn], c[maxn], t;//topo数组用来保存最后的排序结果, 3 //c数组用来判断是否有访问过或者成环 4 //t 用来记录当前topo数组的下标值 5 bool dfs(int u){ 6 c[u] = -1;//标记当前访问点 7 for(int v = 1; v<=n; v++) if(gap[u][v]){ 8 if(c[v]< 0) return false;//形成有向回环,返回错误 9 else if(!c[v] && !dfs(v) ) return false; 10 } 11 c[u] = 1;//标记访问完成 12 topo[--t] = u;//通过--t就可以完成从后往前保存数据(因为递归是从后往前) 13 return true; 14 } 15 bool toposort(){ 16 t = n+1;//t为当前的n个点数(n从0开始的话只要t = n,和将所有 <=n 换成 <n) 17 ms(c, 0); 18 for(int u = 1; u<=n ;u++) 19 if(!c[u]) 20 if(!dfs(u)) return false; 21 return true; 22 }