拓扑排序裸题。
唯一要考虑的是如何保证字典序输出结果。
这里用最简单的方法,每次都将队列里的点排序即可。

#include <stdio.h> #include <queue> #include <algorithm> #include <vector> using namespace std; int n , m , a , b , in[600]; vector <int> g[600]; void init(){ for(int i=0;i<=500;i++) g[i].clear(); for(int i=0;i<=500;i++) in[i] = 0; } int c = 0 , C=0; int at[1000] , fn[1000]; void topo(){ queue<int> q; C = 0; for(int i=1;i<=n;i++) if(in[i] == 0) q.push(i); while(!q.empty()){ int x = fn[++C] = q.front(); q.pop(); c = 0; for(int i=0;i<g[x].size();i++) { int v = g[x][i]; if(in[v] > 0) in[v]--; if(in[v] == 0) q.push(v); }while(!q.empty()) at[++c]=q.front(),q.pop(); sort(at+1,at+1+c); for(int i=1;i<=c;i++) q.push(at[i]); } for(int i=1;i<=C;i++) printf("%d%c",fn[i],i==C?' ':' '); return ; } int main() { while(~scanf("%d %d",&n,&m)){ init(); while(m--){ scanf("%d %d",&a,&b); g[a].push_back(b); in[b] ++; } topo(); } return 0; }