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 逃生反向建图+拓扑排序的主要内容,如果未能解决你的问题,请参考以下文章