在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。
拓扑排序结果的要求:
1,每个顶点出现且只出现一次。
2,若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。
注意:无向图没有没有拓扑排序,因为无法满足条件2
过程:
1,输出没有前驱节点的一个节点
2,将输出的节点删除
3,重复 1,2 直到全部输出
#include <bits/stdc++.h>
using namespace std;
bool check(map<string,set<string>> m,map<string, set<string>>::iterator t)
{
for(auto elem : m)
{
if(elem.second.find(t->first) != elem.second.end())
{
return false;
}
}
return true;
}
void T_sort(map<string,set<string>> m)
{
while(!m.empty())
{
auto t = m.begin();
while(!check(m,t)) ++t;
cout << t->first << endl;
m.erase(t);
}
}
int main()
{
map<string,set<string>> m;
set<string> nothing;
for(int i = 1;i <= 5;++i) m.insert({to_string(i),nothing});
for(int i = 0;i < 7;++i)
{
string x,y;
cin >> x >> y;
m[x].insert(y);
}
T_sort(m);
return 0;
}
/*
1 4
1 2
2 4
2 3
3 5
4 3
4 5
*/