貌似从来没有敲过拓扑排序的板子,,,记录一下
拓扑排序就是对DAG有向无环图中的边u->v,要求排序出一个点的序列,满足u在v的前面,,
算法的思路是不停的将入度为零的点u放到前面,并且对u能到达的所有点v的入度递减,,循环处理所有的点即可,,期间将所有入度为零的点放在一个队列中,,
这道题要求对于多种可能的排序输出字典序最小的那种,,用优先队列代替原来的队列就行了,,
- 注意杭电上不能用万能头文件,而且优先队列的由小到大的写法
priority_queue<int, vector<int>, greater<int> > q;
,头文件要加#include <queue>
和#include <functional>
(一直不知道,,,233,,, - 还有好久不练忘记多组数据要记得清零那些数组,,
代码:
//#include#include #include #include #include #include #include #include #define aaa cout<<233< '9') {if(c == '-') f = -1; c = getchar();} while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar(); return x * f;}//red_book//l[maxn]为最后排序的结果vector g[maxn];int du[maxn], n, m, l[maxn];bool toposort(){ memset(du, 0, sizeof du); for(int i = 1; i <= n; ++i) for(int j = 0; j < g[i].size(); ++j) ++du[g[i][j]]; int tot = 0; priority_queue