挺奇妙的一题
要求符合条件的字典序最小的序列
第一眼,并查集加拓排,思考两分钟果断否决
然后胡思乱想了一段时间,突然想起来NOIP2018D2T1,于是猛然惊醒,反向求最大不就行了
建完反图后脑子抽了,竟然搜到一个rd为零的点跑一次,惊天大错误样例竟然还过了,WA完后冷静思考,发现一个优先队列秒杀一切…我真是个大
∗
∗
**
∗∗帅逼
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<queue>
#include<stack>
using namespace std;
const int maxn = 100007;
struct node
{
int to,next;
}edge[maxn*2];
int cnt,head[maxn];
int rd[maxn],n,m;
void add(int from,int to)
{
edge[++cnt].to=to;
edge[cnt].next=head[from];
head[from]=cnt;
}
void toopsort()
{
priority_queue<int>q;
stack<int>st;
for(int i=n;i>=1;i--)
if(rd[i]==0)
q.push(i);
while(!q.empty())
{
int f1=q.top();
q.pop();
st.push(f1);
for(int i=head[f1];i;i=edge[i].next)
if(--rd[edge[i].to]==0)q.push(edge[i].to);
}
if(st.size()<n)
{
cout<<"Impossible!"<<endl;
return;
}
while(!st.empty())
{
cout<<st.top()<<" ";
st.pop();
}
cout<<endl;
}
int main()
{
int D;
scanf("%d",&D);
while(D--)
{
memset(rd,0,sizeof(rd));
memset(edge,0,sizeof(edge));
memset(head,0,sizeof(head));
cnt=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(y,x);
rd[x]++;
}
toopsort();
}
}