
拓扑排序
ITCharge
高效率编程,慢节奏生活。
展开
-
HDU3342 Legal or Not【拓扑排序】【链式前向星】
题目大意:给你一个有向图,判断是否有环。 思路:构建拓扑排序,如果排序失败,说明该有向图存在有向环。 另一种思路,用链式前向星存储图,在数据输入的同时统计每个点的入度, 并存入indegree数组,每删除一个点,就遍历以这个点为起点的边,将边 对应的入度减1即可选择并删除下一点。用队列来存储已发现的入度为0的 点,更新入度的同时更新这个队列。如果最终得到队列中的元素个数小于 总的元素个数,说明排序失败,存在环。原创 2014-12-19 20:59:07 · 1457 阅读 · 0 评论 -
HDU4857 逃生【逆拓扑排序】
逃生 思路:刚开始以为直接拓扑排序就可以,其实不然。题目的意思是:如果有满足拓扑排序 的多种情况的前提下,让1先尽量靠前,满足1尽量靠前之后,让2尽量靠前,而不是直接 的字典序。 比如: 4 2 3 2 4 1 结果应为4 1 3 2,而不是3 2 4 1。 所以进行反向建边,然后拓扑排序,用链式前向星存储图,为了使得序号小 的点尽量靠前,所以用优先队列存储将入度为0的点,在逐一取出,遍历该点 的边,就使得大的点尽量靠前,最后逆序输出就可以了。 Time Limit: 2000/1000 MS (J原创 2014-12-22 14:57:51 · 1111 阅读 · 0 评论 -
UVA10305 Ordering Tasks【DFS】【拓扑排序】
题目大意:有n个变量,和m个二元组关系。关系(x,y)表示x<y。现在讲所有变量 从小到大来排序,进行输出。 例如:有4个变量a、b、c、d,若a<b,c<b,d<c,则排序后的可能为a<d<c<b, 也有其他可能d<a<c<d。只要输入其中一个就可。 思路:把n个变量看成是n个点,“x<y”看做是一条边,则得到一个有向图。对图的 节点进行排序,使得每一条有向边(x,y)对应的x都在y前边。即所谓的拓扑排序。 DFS进行拓扑排序,如果存在有向环,则不存在拓扑排序,否则就将访问完的结点 假如到当前拓扑序列的前原创 2014-12-12 20:19:34 · 1195 阅读 · 0 评论 -
HDU2647 Reward 【拓扑排序】
题目大意:老板要发酬劳,但是工人酬劳不一样,有N个人,M种情况。a的酬劳一定 要高于b。每个人最低酬劳为888,问:老板最少要花费多少钱。 思路:以b->a为有向边建立拓扑排序,不满足排序就输出"-1",否则就进行拓扑排序, 将拓扑排序的点看成一层一层的,无入度的为第一层,通过一条边能走到的为第二层。 通过两条边才能走到的为第三层。每一层都比前一层多一块钱。最后输出总钱数。原创 2014-12-22 15:50:20 · 903 阅读 · 0 评论 -
HDU4324 Triangle LOVE【拓扑排序】
题目大意:给你一个图,图中任意两点之间要么有正向边,要么有反向边。 判断是否含有a->b->c->a的三角形环。 思路:其实只要有环,就能构成三角形环。因为任意两点之间要么有正向边, 要么有反向边。如果现在有一个四元素环 a->b->c->d->a,若a不指向c,则 c必定指向a,所以必定存在三角形环。直接拓扑排序,如果不能排序,则有 三角环,输出“Yes”,能拓扑排序,则不含有三角环,输出"No"。原创 2014-12-22 22:47:19 · 1440 阅读 · 0 评论 -
HDU5154 Harry and Magical Computer【拓扑排序】
题目大意: 哈利用一个魔法电脑处理N个任务,但是有M个前后关系(a,b), 意思是在b执行之前必须先执行a,即a任务在b任务前,问你是否能满足要求 处理完这N个任务。 思路:拓扑排序,用到了队列。先将所有入度为0的点入队,并用Count统计 入度不为0的点。遍历队列中的点所连的所有边,并减少该点连接边另一端的 入度,只要另一端入度为0了,就将它加入队列中,并统计这一端的个数id。 最后比较id和Count是否相等就可以判断是否能处理完这N个任务。原创 2015-01-04 07:13:35 · 1629 阅读 · 0 评论 -
HDU1285 确定比赛名次【拓扑排序】【优先队列】
思路:因为要满足字典序的拓扑排序,所以用了STL中的优先队列。 priority_queue<int,vector<int>, greater<int> > Q; 实现了权值小的优先级高,取出的时候保证序号是队列中最小的。 其他的和一般的拓扑排序无区别。原创 2014-12-22 22:22:36 · 1153 阅读 · 0 评论 -
拓扑排序【模板】
拓扑排序【模板】1.普通判断拓扑排序、输出路径:queue<int> Q 2.满足字典序的拓扑排序:priority_queue<int,vector<int>, greater<int> > Q; 保证了权值小的优先级高,取出的时候保证序号是队列中最小的。 3.满足最小的尽量在前面(不保证是字典序):priority_queue<int> Q;反向建图,用优先队列存储将入度为0的点,再遍原创 2015-05-02 23:30:40 · 1322 阅读 · 0 评论