题意:要求的是被编号的人的逃跑顺序,但必须满足约束条件(i必须在j前),同时编号小的要在前面。这个题用向量能避免空间不够用的问题。
思路:先用约束条件建图,然后拓扑排序可以满足约束条件,再用优先队列保证编号小的在前。
具体代码:
//拓扑排序保证约束条件成立
//优先队列保证数字大的后出
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#define maxn 30005
using namespace std;
bool vis[maxn];
int in[maxn];
vector<int>edge[maxn];//原本开不出的空间,用向量解决了
int main()
{
int i,j,t,n,m;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
memset(in,0,sizeof(in));
for(i=1;i<=n;i++) edge[i].clear();
int u,v;
for(i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
in[u]++;
edge[v].push_back(u);//记录入度和邻接边
}
priority_queue<int> q;
for(i=1;i<=n;i++)
if(in[i]==0) q.push(i);
memset(vis,0,sizeof(vis));
vector<int> res;
while(!q.empty())
{
u=q.top();
res.push_back(u);
q.pop();
vis[u]=1;
for(i=0;i<edge[u].size();i++)
{
v=edge[u][i];
in[v]--;
if(in[v]==0)
q.push(v);
}
}//如果还有节点入度不为零,则存在环
for(i=res.size()-1;i>=0;i--)
printf("%d%c",res[i],i==0?'\n':' ');
}
return 0;
}