Solution:
首先要注意的是,本题并不是找出字典序最小的拓扑序,但我们可以反过来考虑。
建出原图的反图,即对于每一对限制x,y,连接y->x。然后跑出反图上字典序最大的拓扑序,再将得到的拓扑序反过来即是所求。
这样做为什么是对的呢?抽象一下题目的条件,要求是对于每一个点,拓扑序中能在它后面的一定要在它之后,那么照这个贪心策略,答案序列中的最后一个一定是可行的最大值,在这一步的基础上以此类推,便形成了反图中字典序最大的拓扑序,也正是答案序列反过来。
Code:
#include<bits/stdc++.h>
#define rep(i,j,k) for(int i=j;i<=k;i++)
using namespace std;
template<typename T> void read(T &num){
char c=getchar();num=0;T f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){num=(num<<3)+(num<<1)+(c^48);c=getchar();}
num*=f;
}
template<typename T> void qwq(T x){
i