极简题解|午枫的排列
2026-04-20 20:43:38
发布于:江苏
13阅读
0回复
0点赞
题目大意,在满足第一列在第二列之前的情况下,找字典序最小序列。
那可以理解为,一张有向图,先输出入度为0的,再递增。相同入度去较小。很自然会想到拓扑排序。排序的结果就是答案。如果有环就是-1。
可以用优先队列实现小的在前。每次把入度为0的进队,出队把这个点相邻点的入度-1,为0入队。
最后的答案在出队时再入队,每次输出出队一个。判断有没有环直接看这个队列的总数等不等于n
#include<bits/stdc++.h>
using namespace std;
int n,m;
vector<int>mp[200005];
int a[200005];
int main(){
scanf("%d %d",&n,&m);
for(int i=0,u,v;i<m;i++){
scanf("%d %d",&u,&v);
mp[u].push_back(v);
a[v]++;
}
priority_queue<int,vector<int>,greater<int>>q;
queue<int>ans;
for(int i=1;i<=n;i++)
if(!a[i])q.push(i);
int t;
while(q.size()){
t=q.top();
q.pop();
ans.push(t);
for(auto i:mp[t]){
a[i]--;
if(!a[i])q.push(i);
}
}
for(auto i:a){
if(i){
printf("-1");
return 0;
}
}
while(ans.size()){
printf("%d ",ans.front());
ans.pop();
}
}
这里空空如也







有帮助,赞一个