这题跪了一下午、、都不知道自己怎么错的、、先贴个正确的代码
这题有坑、
/*这题为什么如此之坑,搞acm的人脑回路好曲折,膜拜。 有一堆小球,要求a小球要在b小球前面,最后要求输出的是x号小球的位置; 正向建图是不对的,因为题目要求的是标号小的要尽量在前 如果按照普通的拓扑排序的话,举个栗子,5个点 2条边,2在1前面,5在1前面 那么3和4是自由点,按照普通的拓扑排序的话,结果是 2->3->4->5->1 但是题目要求的是结果是 2->5->1->3->4 正向建图不对的原因是因为独立点,和1有关的点都满足条件,但是独立点总会把小的点挤到后面去 而且正着建图反着找也不对,独立点会在后面,但是小的点也会在后面了 但是如果反向建图的话,而且反着找,每次都把最大的放进去那些大的独立点就会在后面。总之就是很奇葩的一道题、、 */ #include <iostream> #include <math.h> #include <stdio.h> #include <string.h> #include <queue> #include <vector> #include <functional> #include <algorithm> #include <math.h> #define INF 0x3f3f3f3f using namespace std; int p[50000],vis[205],s[205][205],n,sk,sum[205],flag; void tuopu() { int l; memset(vis,0,sizeof(vis)); sk=0; int cnt=n; priority_queue<int ,vector<int>,l<int> >q; for(int i=n;i>=1;i--) { flag=0; for(int j=n;j>=1;j--) { if(vis[j]==0&&p[j]==0) { l=j; flag=1; sum[j]=cnt; cnt--; break; } } vis[l]=1; if(flag==0) { break; } for(int j=n;j>=1;j--) { if(vis[j]==0&&s[l][j]==1) { p[j]--; } } } return ; } int main() { int T,m,a,b; scanf("%d",&T); while(T--) { sk=0; memset(p,0,sizeof(p)); memset(s,0,sizeof(s)); scanf("%d%d",&n,&m); while(m--) { scanf("%d%d",&a,&b); if(s[b][a]==0) { s[b][a]=1; p[a]++; } } tuopu(); if(flag==0) { printf("-1 "); } else { for(int i=1; i<=n; i++) { printf("%d",sum[i]); if(i!=n) { printf(" "); } else { printf(" "); } } } } return 0; }