map来存放graphs
我们用map来存放邻接表,为了提高时间访问效率,我们采用unordered_map来存放graph,这中hashmap读取效率比treemap的读取效率高。
同时,这样也省去了定义很多全局变量的方式。
当然,这种实现方式只是一种参考,学习算法还是需要注重实现算法和提高算法效率。仅供参考。
C++ 代码实现如下所示:
#include <iostream>
#include <unordered_map>
#include <vector>
#include <queue>
using namespace std;
vector<int> toposort(unordered_map<int, vector<int>>& graphs, unordered_map<int, int>& inorders)
{
queue<int> pool;
vector<int> res;
for (auto& item : inorders) {
if (item.second == 0) {
pool.push(item.first);
}
}
while (pool.size()) {
int t = pool.front();
pool.pop();
// visit cur node.
res.push_back(t);
// update cur node infos.
for (auto node : graphs[t]) {
inorders[node]--;
if (inorders[node] == 0) {
pool.push(node);
}
}
}
return res;
}
int main()
{
unordered_map<int, vector<int>> graphs;
unordered_map<int, int> inorders;
int n, m, a, b;
cin >> n >> m;
for (int i = 0; i < m; ++i) {
cin >> a >> b;
if (inorders.count(a) == 0) {
inorders[a] = 0;
}
graphs[a].push_back(b);
inorders[b]++;
}
auto res = toposort(graphs, inorders);
if (res.size() == n) {
for (auto val : res) {
cout << val << " ";
}
cout << endl;
} else {
cout << -1 << endl;
}
return 0;
}