hdu4857 逃生反向建图+拓扑排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu4857 逃生反向建图+拓扑排序相关的知识,希望对你有一定的参考价值。


题目链接:​​http://acm.hdu.edu.cn/showproblem.php?pid=4857​​​
题意:中文题
解析:题意很明显是拓扑排序,但是按题目描述来说,对于有m组限制即a必须在b前面出去,而对于那些没有限制的就必须按照标号从小到大出去,也就是说假设有三个人,3号必须在1号前面除去,2号没限制,那么出去的顺序为3 1 2,为了满足这个需求,反向建图+拓扑排序+优先队列+逆序输出

#include <bits/stdc++.h>
using namespace std;
const int maxn = 30005;
int in[maxn];
vector<int>ans;
vector<int>G[maxn];
int main(void)

int t,n,m;
scanf("%d",&t);
while(t--)

scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
G[i].clear();
memset(in,0,sizeof(in));
ans.clear();
for(int i=1;i<=m;i++)

int x,y;
scanf("%d %d",&x,&y);
G[y].push_back(x);
in[x]++;

priority_queue<int>q;
for(int i=1;i<=n;i++)

if(in[i]==0)
q.push(i);

while(!q.empty())

int u = q.top();
q.pop();
ans.push_back(u);
for(unsigned i = 0;i<G[u].size();i++)

int v = G[u][i];
in[v]--;
if(in[v]==0)
q.push(v);


for(int i = ans.size()-1;i>=0;i--)

if(i)printf("%d ",ans[i]);
else printf("%d\\n",ans[i]);


return 0;

/*
1
3 1
3 1
*/


以上是关于hdu4857 逃生反向建图+拓扑排序的主要内容,如果未能解决你的问题,请参考以下文章

hdu 4857 逃生 拓扑排序+逆向建图

逃生(HDU4857 + 反向拓扑排序)

HDU-4857-逃生-反向拓扑排序+优先队列

HDU 4857 逃生(反向拓扑排序+优先队列)

HDU-4857 逃生(反向拓扑排序 + 逆向输出)

HDU 4857 逃生 (反向拓扑排序 & 容器实现)