http://acm.hdu.edu.cn/showproblem.php?pid=1285
输出字典序最小的拓扑序列;
考虑用优先队列维护,输出每层入度为0的最小的点。只能用bfs,因为bfs可以逐层处理,而dfs只能处理上下层的关系;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<vector>
using namespace std;
const int MAXN = 10001;
int n,m,tot;
int ru[MAXN],a[MAXN];
vector<int>G[MAXN];
priority_queue<int>q;
void bfs(){
while(!q.empty())
{
int x = -q.top();
q.pop();
a[++ tot] = x;
for(int i = 0;i < G[x].size();i ++){
int v = G[x][i];
ru[v] --;
if(!ru[v]){
q.push(-v);
}
}
}
return;
}
void init(){
for(int i = 1;i <= n;i ++){
G[i].clear();
a[i] = ru[i] = 0;
}
tot = 0;
return;
}
void solve(){
for(int i = 1;i <= m;i ++){
int f,t;
scanf("%d%d",&f,&t);
G[f].push_back(t);
ru[t] ++;
}
for(int i = 1;i <= n;i ++){
if(!ru[i]) q.push(-i);
}
bfs();
for(int i = 1;i < tot;i ++) printf("%d ",a[i]);
printf("%d\n",a[tot]);
return;
}
int main(){
while(cin >> n >> m){
init();
solve();
}
return 0;
}