1039 拓扑排序
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int main()
{
int n_test;
cin>>n_test;
for(int i=0;i<n_test;i++)
{
int n_vertex;
int n_edge;
cin>>n_vertex;
cin>>n_edge;
int in_degree[n_vertex+1] = {0,};
vector<vector<int>> adj(n_vertex+1, vector<int>(n_vertex+1, 0));
vector<int> ans;
queue<int> zero_degree;
for(int j=0;j<n_edge;j++)
{
//u->v
int u;
int v;
cin>>u;
cin>>v;
adj[u].push_back(v);
in_degree[v]++;
}
for(int k=1;k<=n_vertex;k++)
{
if(in_degree[k]==0)
{
zero_degree.push(k);
}
}
int num = 0;
while(!zero_degree.empty())
{
int vertice = zero_degree.front();
zero_degree.pop();
ans.push_back(vertice);
for(int i=0;i<adj[vertice].size();i++)
{
if(adj[vertice][i]!=0 &&--in_degree[adj[vertice][i]]==0)
{
zero_degree.push(adj[vertice][i]);
}
}
num++;
}
if(num!=n_vertex)
{
cout<<"0";
}
else
{
for(int i=0;i<ans.size();i++)
{
cout<<ans[i]<<" ";
}
}
cout<<endl;
}
}