由于拓扑排序连边规则是对于两个点 $a_i,a_j$,如果 $i<j$,那么将 $a_i$ 连向 $a_j$。

因为数据很小,所以我们用 next_permutation 求出第 $k$ 个排列,再将每个数在此排列中的位置存起来,按照上面的规则连边即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<bits/stdc++.h>
using namespace std;
int n,m,k,a[10005],b[10005];
int main() {
cin>>n>>m>>k;
for(int i=1;i<=n;i++){
a[i]=i;
}
for(int i=1;i<=k-1;i++){
next_permutation(a+1,a+n+1);
}
for(int i=1;i<=n;i++){
b[a[i]]=i;
}
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
cout<<(b[u]>b[v]);
}
return 0;
}