//并不理解为什么需要反向建图,由大到小倒序确定排名。感觉正向由小到大和反向由大到小应该是一样的。
解:拓排+贪心,反向建边,先找排名靠后的(now,不知道为什么)
1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<algorithm> 5 #include<cstring> 6 #include<cstdlib> 7 #include<queue> 8 #include<vector> 9 #include<map> 10 #include<stack> 11 #include<string> 12 13 using namespace std; 14 15 vector <int> G[207]; 16 int T,n,m; 17 int a[207],b[207]; 18 int d[207]; 19 int now; 20 21 int main(){ 22 scanf("%d",&T); 23 for (int cas=0;cas<T;cas++){ 24 scanf("%d%d",&n,&m); 25 for (int i=1;i<=n;i++){ 26 G[i].clear(); 27 d[i]=0; 28 } 29 for (int i=0;i<m;i++){ 30 int x,y; 31 scanf("%d%d",&x,&y); 32 d[x]++; 33 G[y].push_back(x); 34 } 35 now=n; 36 for (int i=0;i<n;i++){ 37 for (int j=n;j>=1;j--){ 38 if (d[j]==0){ 39 d[j]=-1; 40 a[now--]=j; 41 int sz=G[j].size(); 42 for (int k=0;k<sz;k++){ 43 d[G[j][k]]--; 44 } 45 break; 46 } 47 } 48 } 49 if (now!=0){ 50 printf("-1 "); 51 continue; 52 } 53 for (int i=1;i<=n;i++){ 54 b[a[i]]=i; 55 } 56 for (int i=1;i<=n;i++){ 57 printf("%d%c",b[i],i==n?' ':' '); 58 } 59 } 60 return 0; 61 } 62 /* 63 1 64 6 5 65 6 1 66 1 5 67 4 5 68 2 4 69 3 4 70 71 5 72 4 0 73 4 1 74 1 1 75 4 2 76 1 2 77 2 1 78 4 1 79 2 1 80 4 1 81 3 2 82 */