拓扑排序
输入:一个有向图
输出:顶点的拓扑序列
具体流程:
(1) 将所有入度为0的点加入队列
(2) 每次取出队首顶点
(3) 删除其连出的边,检查是否有新的入度为0的顶点,有则加入队列
(4) 重复(2)直到队列为空
样例输入
5 5 0 1 1 0 2 1 1 2 1 2 3 1 4 2 1
样例输出
0 4 1 2 3
1 #include <iostream> 2 #include <queue> 3 using namespace std; 4 5 int ** edges; 6 int * in_degrees; 7 int * out_degrees; 8 int v,e; 9 10 void topSort(){ 11 queue<int> q; 12 for(int i=0;i<v;i++){ 13 if(0 == in_degrees[i]){ 14 q.push(i); 15 } 16 } 17 while(!q.empty()){ 18 int front = q.front(); 19 q.pop(); 20 printf("%d ",front); 21 for(int j=0;j<v;j++){ 22 if(edges[front][j]!=0){ 23 edges[front][j] = 0; 24 in_degrees[j]--; 25 if(0 == in_degrees[j]){ 26 q.push(j); 27 } 28 } 29 } 30 31 } 32 } 33 34 int main(void){ 35 cin>>v>>e; 36 //init 37 edges = new int*[v]; 38 in_degrees = new int[v]; 39 out_degrees = new int[v]; 40 memset(in_degrees,0,v*sizeof(int)); 41 memset(out_degrees,0,v*sizeof(int)); 42 int i; 43 for(i=0;i<v;i++){ 44 edges[i] = new int[v]; 45 memset(edges[i],0,v*sizeof(int)); 46 } 47 48 49 50 //input 51 for(i=0;i<e;i++){ 52 int a,b,w; 53 cin>>a>>b>>w; 54 edges[a][b] = w; //从a到b有一条路 55 in_degrees[b]++; //b的入度加1 56 out_degrees[a]++; //a的出度加1 57 } 58 59 topSort(); 60 61 //huishou 62 for(i=0;i<v;i++){ 63 delete edges[i]; 64 } 65 delete edges; 66 delete in_degrees; 67 delete out_degrees; 68 return 0; 69 }
【推荐】编程新体验,更懂你的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 调用教程)