http://tjuacm.chaosheng.top/problem.php?id=1272
https://vjudge.net/problem/HDU-1285
参考 https://blog.csdn.net/red_red_red/article/details/84329559
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int N = 510;
int n, m;
int vis[N];
int indegree[N];
int map[N][N];
void tuopu(){
// 维护入度为0的节点,编号从小到大排序,保证编号小的节点的拓扑序小
priority_queue<int,vector<int>,greater<int> >q;//优先级队列
for(int i = 1; i <= n; i++){
if(indegree[i] == 0){
q.push(i);
}
}
bool temp = false;//控制空格
while(q.size()){
int top = q.top();
q.pop();
indegree[top]--; //已经输出的数,入度置为-1
if(!temp)
printf("%d",top);
else
printf(" %d",top);
temp = true;
for(int i = 1; i <= n; i++){
if(map[top][i]){//与刚才输出的数,有关系的,入度--
indegree[i]--;
if(!indegree[i]){
q.push(i); //如果成了0;进队
}
}
}
}
printf("\n");
}
int main(){
int a, b;
while(cin >> n >> m){
int f = 1;
memset(map, 0, sizeof(map));
memset(indegree, 0, sizeof(indegree));
for(int i = 1; i <= m; i++){
cin >> a >> b;
if(map[a][b] == 0){
map[a][b] = 1;
indegree[b]++;
}
}
tuopu();
}
return 0;
}
京公网安备 11010502036488号