TopoSort(拓扑排序)
其实说白了,拓扑排序就是一个广度优先搜索。
拓扑排序的方法如下:
(1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它.
(2)从网中删去该顶点,并且删去从该顶点发出的全部有向边.
(3)重复上述两步,直到剩余的网中不再存在没有前趋的顶点为止.
本题目是采用的邻接表存储方法。
具体的实现是用vector数组。
题目:HDU 1285 http://acm.hdu.edu.cn/showproblem.php?pid=1285

#include "iostream" #include "vector" #include "queue" using namespace std; #define MAX 505 int InDeg[MAX]; int n, m, Count; int Ans[MAX]; void TopoSort(vector<int> v[]) { priority_queue<int, vector<int>, greater<int> > PQ; for(int i=1; i<=n; i++) //找出入度为0的点并放入优先队列 if(InDeg[i]==0) PQ.push(i); while(!PQ.empty()) //BFS { int Tmp = PQ.top(); PQ.pop(); Ans[Count++] = Tmp; for(int i=0; i<v[Tmp].size(); i++) { InDeg[v[Tmp][i]]--; if(InDeg[v[Tmp][i]]==0) PQ.push(v[Tmp][i]); } } } int main() { int x, y; while(cin>>n>>m) { vector<int> V[MAX]; memset(Ans, 0, sizeof(Ans)); Count = 0; memset(InDeg, 0, sizeof(InDeg)); for(int i=0; i<m; i++) { cin>>x>>y; InDeg[y]++; V[x].push_back(y); } TopoSort(V); for(int i=0; i<Count-1; i++) cout<<Ans[i]<<" "; cout<<Ans[Count-1]<<endl; } }
posted on 2012-04-11 18:36 More study needed. 阅读(949) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架