hdu 4857(逆序拓扑排序)
2014-07-22 21:33
141 查看
题意:
中文题
解题思路:
利用逆拓扑排序,然后在逆序输出即为答案。
解释:
首先我们建立逆向邻接表,进行对每个结点入度的计算,并用一个ans数组来存放最终的答案,且我们可以判断出的是当前结点入度为零的点出发的所有点都将在该点之后存放在ans数组中,且当我们遇到多个入度为零的的结点时,我们选择度数大的结点先放入到ans中,为什么?因为当这样我们能保证富裕的人能排在ans的后面,且在逆序输出时,即排在穷的人前面。
注意:
优先队列
中文题
解题思路:
利用逆拓扑排序,然后在逆序输出即为答案。
解释:
首先我们建立逆向邻接表,进行对每个结点入度的计算,并用一个ans数组来存放最终的答案,且我们可以判断出的是当前结点入度为零的点出发的所有点都将在该点之后存放在ans数组中,且当我们遇到多个入度为零的的结点时,我们选择度数大的结点先放入到ans中,为什么?因为当这样我们能保证富裕的人能排在ans的后面,且在逆序输出时,即排在穷的人前面。
注意:
优先队列
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <queue> #include <vector> using namespace std; #define MAXN0 30001 vector<int>G[MAXN0]; priority_queue<int,vector<int>,less<int> >pq; int ct[MAXN0],n,m,ans[MAXN0],cnt; void TopSort(){ int num,tmp0; while(!pq.empty()){ num = pq.top(); pq.pop(); ans[cnt++] = num; for(int i=0;i<G[num].size();++i){ tmp0 = G[num][i]; --ct[tmp0]; if(!ct[tmp0]){ pq.push(tmp0); } } } } void solve(){ cnt = 0; for(int i=1;i<=n;++i){ if(!ct[i]){ pq.push(i); } } TopSort(); printf("%d",ans[cnt-1]); for(int i=cnt-2;i>=0;--i){ printf(" %d",ans[i]); } printf("\n"); } void clear(){ for(int i=1;i<=n;++i){ if(G[i].size()){ G[i].clear(); } } } int main(){ int T,u,v; scanf("%d",&T); // pq.push(1); // pq.push(2); // while(!pq.empty()){ // int num = pq.top(); // printf("%d\n",num); // } // while(1); while(T--){ memset(ct,0,sizeof(ct)); scanf("%d%d",&n,&m); for(int i=1;i<=m;++i){ scanf("%d%d",&u,&v); G[v].push_back(u); ++ct[u]; } solve(); clear(); } return 0; }
相关文章推荐
- [HDU](4857)逃生 ---拓扑排序(反向)+STL优先级队列(图)
- HDU4857——逃生(反向建图+拓扑排序)(BestCoder Round #1)
- hdu 4857 逃生(拓扑排序)
- HDU 4857-逃生(反向拓扑排序-按条件排序)
- hdoj 4857 逃生 (拓扑排序--逆序构图+邻接表+优先队列)
- hdu 4857 逃生(拓扑排序)
- 逃生 HDU - 4857 拓扑排序
- hdu 4857 逃生(逆向拓扑排序)(STL应用)
- hdu 4857 逃生(拓扑排序)
- hdu 4857 逃生(拓扑排序)
- HDU-4857逃生(反向拓扑排序)(重点是思想)
- hdu 4857 逆向拓扑排序+逆向输出
- hdu--1285 && 4857 --正向 || 逆向拓扑排序 && 优先队列
- HDU 4857 逃生(反向拓扑排序)
- HDU 1285 确定比赛名次 + HDU 4857 逃生(拓扑排序由浅入深)
- hdu 4857 逃生(拓扑排序)
- hdu-4857-逃生-拓扑排序
- hdu 4857 逃生(拓扑排序)
- HDU 4857 (反向拓扑排序 + 优先队列)
- HDU 4857 逃生 拓扑排序+反向建图