简单的题目,拓扑排序,记录好边与边之间的关系以及顶点的入度,根据关系进行更新就可以了,源代码如下:
#include<iostream>
#include<vector>
#include<string>
#include<set>
#include<stack>
#include<queue>
#include<map>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<cstring>
#include<sstream>
using namespace std;
int n, m;
int in[110];
int main(){
while (cin >> n >> m){
if (n == 0 && m == 0) break;
memset(in, 0, sizeof(in));
vector<vector<int>> area(n+1);
for (int i = 0; i < m; i++){
int a, b;
cin >> a >> b;
in[b]++;
area[a].push_back(b);
}
int amount = 0;
vector<int> res;
stack<int> st;
while (true){
for (int i = 1; i <= n; i++){
if (in[i] == 0){
in[i]--;
st.push(i);
}
}
while (!st.empty()){
int t = st.top();
st.pop();
res.push_back(t);
amount++;
for (int i = 0; i < area[t].size(); i++){
int index = area[t][i];
in[index]--;
}
}
if (amount == n) break;
}
for (int i = 0; i < res.size(); ){
cout << res[i];
i++;
if (i != res.size()) cout << " ";
else cout << endl;
}
}
return 0;
}