//拓扑排序算法,每次找入度为0的节点,保存然后删与之相关的邻边。算法的正确性的证明,百度上有。不过之前我用一次dfs加邻接矩阵写一个按结束时间进行线性排序。但不能过。。囧 #include <iostream> #include <string> #define maxn 501 using namespace std; int map[maxn][maxn]; int into[maxn],ans[maxn],n,m; void toposort() { int i,j,k; for(i = 1; i<=n; i++) for(j = 1; j<=n; j++) if(map[i][j])into[j]++; for(i = 1; i<=n; i++) { j = 1; while(into[j]!=0) { j++; } ans[i] = j; into[j]--; for(k = 1; k<=n; k++) if(map[j][k])into[k]--; } } int main() { int i,j,u,v; while(scanf("%d %d",&n,&m)!=EOF) { memset(into,0,sizeof(into)); memset(map,0,sizeof(map)); for(i = 0; i<m; i++) { scanf("%d %d",&u,&v); map[u][v] = 1; } toposort(); for(i = 1; i<n; i++) printf("%d ",ans[i]); printf("%d/n",ans[n]); } return 0; }