陈在田
(末影娘(我是男的))
1
有需要可以自取
#include<bits/stdc++.h>
using namespace std;
int in[1005], out[1005]; //入度,出度
int n, m, d;
vector<vector<int>> g(1005);
vector<int> topsort; //最终的拓扑序
void del(int u); //删点
void solve(); //主要操作函数(解决问题的)
int main() {
memset(in, 0, sizeof in);
memset(out, 0, sizeof out);
//初始化
cin >> n >> m;
d = n;
for (int i = 1; i <= m; i++) {
int u, v;
cin >> u >> v;
g[u].push_back(v); //有向图建边
out[u]++; //出度++
in[v]++; //另外一个被指向的点,入度++
}
solve(); //进入操作函数
for(auto it:topsort)
{
cout<<it<<' ';
} //输出答案(字典序最小,数字情况下)
}
void solve() {
while (d > 0) { //还有可以删除的节点
int f = 0;
for (int i = 1; i <= n; i++) {
if (in[i] == 0) {
del(i); //删除这个点
f = 1; // 发现可删除的节点
}
}
if (!f and d>0) { //没有可删除的节点,且还有节点未被删除
cout << "-1";
exit(0);
}
}
}
void del(int u) { //删点函数
in[u] = -1; // 标记为已删除
out[u] = 0; // 清空出度
topsort.push_back(u);
d--; // 更新剩余未删除节点的数量
for (auto it : g[u]) {
in[it]--;
} //将它指向的每一个点的入度--
}