拓扑排序 模板
#include<iostream> #include<cstdio> #include <cctype> #include<algorithm> #include<cstring> #include<cmath> #include<string> #include<cmath> #include<set> #include<vector> #include<stack> #include<queue> #include<map> using namespace std; #define ll long long #define mem(a,x) memset(a,x,sizeof(a)) #define se second #define fi first const ll mod=998244353; const int INF= 0x3f3f3f3f; const int N=2e5+5; int n,m; vector<int>e[105]; vector<int>ans; int in[105]; queue<int>q; void bfs() { while (!q.empty()) q.pop(); for(int i=1;i<=n;i++) //n 节点的总数 if(in[i]==0) q.push(i);//将入度为0的点入队列 while(!q.empty()) { int p=q.front(); q.pop(); // 选一个入度为0的点,出队列 ans.push_back(p); for(int i=0;i<e[p].size();i++) { int y=e[p][i]; in[y]--; if(in[y]==0) q.push(y); } } } int main() { while(cin>>n>>m && (n ||m) ) { mem(in,0); mem(e,0); ans.clear(); int a,b; for(int i=1;i<=m;i++){ scanf("%d%d",&a,&b); e[a].push_back(b); in[b]++; } bfs(); for(int i=0;i<ans.size()-1;i++) printf("%d ",ans[i] ); cout<<ans[ans.size()-1]<<endl; } }