一、定义:
拓扑排序是对有向无回路图(DAG)顶点的一种排序,它使得如果存在从u到v的有向路径,那么满足序列中u在v前。
例如:(来自于某牛)
最后变成
所以我们的算法可以描述为这样一个过程:
1、找到整个图中所有的原点,将这些点压进队列(栈)中
2、从队列(栈)中取出一点,输出,将该点及它的边删除,找到它所指向的点,如果改点是一个原点(删除指向它的点后),...
分类:
其他好文 时间:
2014-07-23 13:15:06
阅读次数:
222
题意:有N个人,M个优先级a,b表示a优先于b,并且每个人有个编号的优先级,输出顺序。
思路来自:与PKU3687一样
在基本的拓扑排序的基础上又增加了一个要求:编号最小的节点要尽量排在前面;在满足上一个条件的基础上,编号第二小的节点要尽量排在前面;在满足前两个条件的基础上,编号第三小的节点要尽量排在前面……依此类推。(注意,这和字典序是两回事,不可以混淆。)
如图 1 所示,满...
分类:
其他好文 时间:
2014-07-23 13:14:57
阅读次数:
363
这道题好吧,一开始便是拓扑排序的想法,搞了好久,试了多组测试数据,没错啊,可是没过。。。作孽啊,竟然忘了拓扑不能处理环,白浪费了一晚上。。。只好用动态规划了。。DP【time】【city】表示在time时刻到达city的最迟出发时间,当然,在这个时间不一定到city。转移方程挺简单,不说你也会。 1...
分类:
其他好文 时间:
2014-07-23 12:07:56
阅读次数:
298
hdu 4857 逃生(拓扑逆排序+优先队列)...
分类:
其他好文 时间:
2014-07-23 00:05:47
阅读次数:
266
hdu4857逃生第一题是拓扑排序,不是按照字典序最小输出,而是要使较小的数排在最前面。。赛后弄了好久,才比较明白,我一直以为反向建图,i从1到n,开始深搜dfs( i ),对i点的边,由小到大继续搜一下,同时标记搜过的数,搜过之后就不再搜,搜到底之后ans[cnt++] = u;这样顺序输出就是答...
分类:
其他好文 时间:
2014-07-22 22:47:36
阅读次数:
261
#include #include #include using namespace std;#define N 505int ma[N][N],ans[N],indegree[N];int main(){ int i,j,n,m; while(~scanf("%d %d",&n,&m)...
分类:
其他好文 时间:
2014-07-22 22:44:55
阅读次数:
170
拓扑排序,以边上标号为点,正方形为边,拓扑图中存在有向环时unbounded,否则bounded;注意:仔细处理输入; 遍历一个点时,下一次遍历拼上的下一个方形边;即假设遍历到 A+ 时,下次从 A- 开始遍历; 1 #include 2 #include 3 #include 4 us...
分类:
其他好文 时间:
2014-07-22 22:41:15
阅读次数:
282
1、拓扑排序,要求输出小的数尽量靠前,而不是字典序...
分类:
其他好文 时间:
2014-07-22 22:39:33
阅读次数:
196
拓扑排序。
反向建边。
为了序号小的尽量在前面,我们每次都取出入度为0的最大的点。
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
struct list
{
int u,v,w;
int next;
}edge[110000];
int ...
分类:
其他好文 时间:
2014-07-22 22:38:54
阅读次数:
265