g[][] ind[] res[]
#include<bits/stdc++.h> using namespace std; const int maxn=5e2+5; typedef long long ll; int n,m,g[maxn][maxn],ind[maxn],res[maxn]; void topu(){ int k; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ /*这句根据题目改(同时入度为0时,什么在前) 这题是编号小的优先 若要求广度优先(按层遍历)则用队列 */ if(!ind[j]){ res[i]=j; ind[j]--; k=j; break;//易忘 } } for(int j=1;j<=n;j++){ if(g[k][j]){ ind[j]--; } } } } int main(){ int x,y; while(cin>>n>>m){ memset(g,0,sizeof(g)); memset(ind,0,sizeof(ind)); while(m--){ cin>>x>>y; //对输的入度,所以度越小的排名越靠前 if(!g[x][y]){ g[x][y]=1;ind[y]++; } } topu(); for(int i=1;i<n;i++) cout<<res[i]<<" "; cout<<res[n]<<endl; } }
08-10
08-10