拓扑排序-DFS
拓扑排序的DFS算法
输入:一个有向图
输出:顶点的拓扑序列
具体流程:
(1) 调用DFS算法计算每一个顶点v的遍历完成时间f[v]
(2) 当一个顶点完成遍历时,将该顶点放到一个链表的最前面
(3) 返回链表(按照链表次序输出顶点即为顶点的拓扑序列)
样例输入
5 5 0 1 1 0 2 1 1 2 1 2 3 1 4 2 1
样例输出
4 0 1 2 3
因为对有向无环图进行dfs遍历,得到的可能是森林,所以为了保证对所有点进行拓扑排序,我的做法是对所有入度为0的点进行dfs遍历
1 #include <iostream> 2 #include <deque> 3 using namespace std; 4 5 int ** edges; 6 int * visited; 7 int * in_degrees; 8 9 int v,e; 10 deque<int> dq; 11 void dfs(int i){ 12 visited[i] = 1; 13 for(int j=0;j<v;j++){ 14 if(!visited[j] && edges[i][j] != 0){ 15 dfs(j); 16 } 17 } 18 dq.push_front(i); 19 } 20 21 22 int main(void){ 23 cin>>v>>e; 24 //init 25 edges = new int*[v]; 26 visited = new int[v]; 27 in_degrees = new int[v]; 28 memset(visited,0,v*sizeof(int)); 29 memset(in_degrees,0,v*sizeof(int)); 30 31 int i; 32 for(i=0;i<v;i++){ 33 edges[i] = new int[v]; 34 memset(edges[i],0,v*sizeof(int)); 35 } 36 37 38 //input 39 for(i=0;i<e;i++){ 40 int a,b,w; 41 cin>>a>>b>>w; 42 edges[a][b] = w; //从a到b有一条路 43 in_degrees[b]++; //b的入度加1 44 } 45 46 for(i=0;i<v;i++){ 47 if(0==in_degrees[i]){//从入度为0的点进行dfs遍历 48 dfs(i); 49 } 50 } 51 while(!dq.empty()){ 52 printf("%d ",dq.front()); 53 dq.pop_front(); 54 } 55 //huishou 56 for(i=0;i<v;i++){ 57 delete edges[i]; 58 } 59 delete edges; 60 return 0; 61 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)