Toposort(拓扑排序)dfs递归模板

最近刷了几题拓扑排序的题,记录一下拓扑排序

 

在有向图中,并且按照一定的规则(题目所给的规则)排序。如果图中出现了有向环的话就无法排序了。

 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 }

附上相关题目:1)http://codeforces.com/problemset/problem/510/C

posted @ 2017-04-05 13:44  Dh_q  阅读(447)  评论(0编辑  收藏  举报