总结一下:一道非常简单的拓扑排序模板题,原谅我只能从BFS出发解决这道题目,DFS目前我还无法弄出来,主流的算法其实都是从BFS来解决拓扑排序,比较符合人的思考习惯。
// 给任务排序.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
const int maxn = 105;
vector<int> graph[maxn];
int inDegree[maxn];
vector<int> result;
int n, m;
/*
using namespace std;
int c[maxn];
int topo[maxn], t;
bool G[maxn][maxn];int n;int m;
bool dfs(int u)
{
c[u] = -1;
for (int v = 0;v < n;v++)
{
if (G[u][v])
{
if (c[v] == -1)return false;
else if (!c[v] && !dfs(v))return false;
}
}
c[u] = 1;
topo[--t] = u;
return true;
}
bool toposort()
{
t = n;
memset(c, 0, sizeof(c));
for (int i = 1;i <= n;i++)
{
if (!c[i])
{
if (!dfs(i))
return false;
}
}
return true;
}*/
void TopologicalSort(int n)
{
queue<int> q;
for (int i = 1;i <= n;i++)
{
if (inDegree[i] == 0)
{
q.push(i);
}
}
int number = 0;
while (!q.empty())
{
int u = q.front();
result.push_back(u);
q.pop();
for (int i = 0;i < graph[u].size();i++)
{
int v = graph[u][i];
inDegree[v]--;
if (inDegree[v] == 0)
{
q.push(v);
}
}
}
}
int main()
{
while (cin >> n >> m && n != 0)
{
memset(inDegree, 0, sizeof(inDegree));
memset(graph, 0, sizeof(graph));
result.clear();
for (int i = 0;i < m;i++)
{
int from, to;
cin >> from >> to;
graph[from].push_back(to);
inDegree[to]++;
}
TopologicalSort(n);
for (int i = 0;i < result.size();i++)
{
cout << result[i] << ' ';
}
cout << endl;
}
}