貌似是拓扑排序,其实像尾随
#include <iostream> #include <vector> #include <set> using namespace std; set <int> s; vector<int> v[100001]; int k[100011] = {0}; int t,n,m,i,j; int main(int argc, char const *argv[]) { cin >> t; while(t--) { cin >> n >> m; while(m--) { cin >> i >> j; v[i].push_back(j); k[j]++; } for( i = 1; i <= n; i++) if(k[i] == 0) s.insert(i); while(!s.empty()) { i = *s.begin(); cout << i << " "; s.erase(s.begin()); while(!v[i].empty()) { if(--k[v[i].back()] == 0) s.insert(v[i].back()); v[i].pop_back(); } } cout << endl; } return 0; }