HDU 4857 逃生 (优先队列+反向拓扑)
2014-07-23 14:39
281 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857
解题报告:有n个点,有m个条件限制,限制是像这样的,输入a b,表示a必须排在b的前面,如果不能确定两个数谁排在前面则尽量把小的排在前面。
首先把出度为0的点加入到优先队列中,然后每次用优先队列中弹出的点去更新其它点的出度,更新的同时如果又有其它点的出度为0的话又加到优先队列中,
最后按照从优先队列中出队的反序输出就可以了。我还是不懂为什么按照入度为0然后加入到优先队列然后正序输出这样为什么不行。希望有懂的人可以告诉我。
View Code
解题报告:有n个点,有m个条件限制,限制是像这样的,输入a b,表示a必须排在b的前面,如果不能确定两个数谁排在前面则尽量把小的排在前面。
首先把出度为0的点加入到优先队列中,然后每次用优先队列中弹出的点去更新其它点的出度,更新的同时如果又有其它点的出度为0的话又加到优先队列中,
最后按照从优先队列中出队的反序输出就可以了。我还是不懂为什么按照入度为0然后加入到优先队列然后正序输出这样为什么不行。希望有懂的人可以告诉我。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<vector> using namespace std; const int maxn = 30000+5; priority_queue<int> que; vector<int> vt[maxn]; int du[maxn],ans[maxn]; int main() { int T,n,m; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); int u,v; for(int i = 1;i <= n;++i) vt[i].clear(); memset(du,0,sizeof(du)); while(m--) { scanf("%d%d",&u,&v); du[u]++; vt[v].push_back(u); } for(int i = 1;i <= n;++i) //把出度为0的先加到优先队列中 if(!du[i]) que.push(i); int f = n - 1; while(!que.empty()) { int s = que.top(); que.pop(); ans[f--] = s; int len = vt[s].size(); for(int i = 0;i < len;++i) { int tt = vt[s][i]; du[tt]--; if(du[tt] == 0) que.push(tt); } } for(int i = 0;i < n;++i) printf(i == 0? "%d":" %d",ans[i]); puts(""); } return 0; }
View Code
相关文章推荐
- HDU 4857--逃生【拓扑排序 && 反向拓扑】
- hdu 4857 逃生(反向拓扑)
- 【HDU】4857 - 逃生(拓扑 & STL - vector & 优先队列 & 栈,反向拓扑好题)
- HDU 4857 逃生(拓扑排序+优先队列+反向建边)
- HDU 4857:逃生【拓扑】
- HDU 4857 (反向拓扑排序 + 优先队列)
- [HDU](4857)逃生 ---拓扑排序(反向)+STL优先级队列(图)
- HDU 4857 逃生(反向拓扑排序)
- 转 :hdoj 4857 逃生【反向拓扑】
- HDU 4857 逃生 【逆拓扑 优先队列】
- HDU 4857 逃生(逆向拓扑)
- HDU-4857-逃生【拓扑排序】(反向排序)
- 逃生 HDU杭电4857 【反向拓扑+优先队列+反向输出】
- HDU - 4857 逃生(反向建图 + 拓扑排序)
- HDU 4857 逃生 (拓扑排序+反向建图)
- HDU4857——逃生(反向建图+拓扑排序)(BestCoder Round #1)
- HDU 4857 逃生 【拓扑排序+反向建图+优先队列】
- hdu 4857 逃生 反向拓扑排序+优先队列
- hdu 4857 反向拓扑问题
- 反向拓扑排序 HDU 4857 逃生