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

转载于:https://www.cnblogs.com/denghaiquan/p/6668340.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值