You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

62 lines
1.5 KiB

2 years ago
#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
//拓扑排序有两种方式就是bfs和dfs,一般书中介绍的大多数是bfs,大家就以为拓扑排序只有一种办法,其实是不对的。
//参考链接 https://blog.csdn.net/weixin_43918531/article/details/86740991
/**
5 4
1 2
2 3
2 5
3 4
1 2 5 3 4
*/
//本代码功能以dfs输出一个有向无环图DAG的拓扑序
const int N = 1010;
bool st[N]; //标识是不是已经使用过
vector<int> edge[N]; //邻接表
vector<int> res; //拓扑序列
/**
*
* @param u
*/
void dfs(int u) {
//如果访问过了,则返回,不再重复访问
if (st[u])return;
//标识u结点已使用
st[u] = true;
//遍历每个出边,找到下一组结点
for (int v:edge[u]) if (!st[v]) dfs(v);
//这一层完毕才把它自己扔进去,最后扔等于最先输出,因为后面是倒序输出的
res.push_back(u);
}
int n; //n个结点
int m; //m条边
int main() {
//读入,建图
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int x, y;
cin >> x >> y;
edge[x].push_back(y);
}
//将所有结点进行深入优先搜索
for (int i = 1; i <= n; i++) dfs(i);
//输出,从后向前输出
for (int i = res.size() - 1; i >= 0; i--)
cout << res[i] << " ";
}