尤其要注意拓扑的分层问题 不难理解 就是不怎么好想到 拓扑的思路这里就不累述了
#include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <queue> #define maxn 30007 using namespace std; int T; int n,m; int in[maxn]; vector<int> edge[maxn]; priority_queue<int> q; int main() { scanf("%d",&T); while(T--) { memset(in,0,sizeof(in)); scanf("%d%d",&n,&m); for(int i = 1;i <= n;i++) edge[i].clear(); int a,b; for(int j = 1;j <= m;j++) { scanf("%d%d",&a,&b); in[a]++; edge[b].push_back(a); } for(int i = 1;i <= n;i++) if(!in[i]) q.push(i); vector<int> ans; while(!q.empty()) { a = q.top(); ans.push_back(a); q.pop(); for(int j = 0;j < edge[a].size();j++) { b = edge[a][j]; in[b]--; if(in[b] == 0) q.push(b); } } for(int i = ans.size()-1;i > -1;i--) { if(i != 0) printf("%d ",ans[i]); else printf("%d ",ans[i]); } } return 0;