题解
简单的拓扑排序。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100 + 5;
int graph[maxn][maxn];
int indegree[maxn];
int n, m;
void topo()
{
queue<int> Q;
vector<int> ans;
for(int i = 1; i <= n; ++i)
{
if(indegree[i] == 0)
Q.push(i);
}
while(!Q.empty())
{
int u = Q.front();
ans.push_back(u);
Q.pop();
for(int i = 1; i <= n; ++i)
{
if(graph[u][i]){
if(--indegree[i] == 0)
Q.push(i);
}
}
}
for(int i = 0; i < (int)ans.size(); ++i)
{
if(i) cout << " ";
cout << ans[i];
}
cout << endl;
}
int main()
{
ios::sync_with_stdio(false);
while(cin >> n >> m && n)
{
memset(indegree, 0, sizeof(indegree));
memset(graph, 0, sizeof(graph));
int a, b;
for(int i = 0; i < m; ++i)
{
cin >> a >> b;
graph[a][b] = 1;
indegree[b]++;
}
topo();
}
}