拓扑序:如果图中从v到w有一条有向路径,则v一定排在w之前。满足此顶点条件的称为拓扑序;
拓扑排序的方法很简单:(1)遍历图的每个结点,将入度为0的结点放入一个容器里(可为堆栈或队列,但两种的结果不一样);(2)将该结点的领结点的入度减一,并检查领结点的入度,若为0,将其放入容器中,直到不存在入度为0的结点为止;
若对于排课的问题上堆栈和队列的区别主要为:
堆栈类似于深度优先搜索,堆栈会导致学术很长时间学习一个领域的知识
而队列类似与广度优先搜索,会出现先学简单的再学难度大一些的
以下为容器为堆栈的实现:
#include<iostream>
#include<list>
#include<stack>
#include<vector>
using namespace std;
stack<int> stl;//保存入度为0的结点编号
vector<int > inDegree;//保存结点的入度
vector<list<int> > Adj;
void CreatGraph() {
int n, m, v1, v2;
cin >> n >> m;
//初始化
Adj.assign(n, list<int>());
inDegree.assign(n, 0);
while (m--) {
cin >> v1 >> v2;
Adj[v1].push_back(v2);
inDegree[v2]++;
}
for (int i = 0; i < n; i++) {
if (inDegree[i] == 0)
stl.push(i);
}
}
void TopSort(){
vector<int> vec;
int v;
int cnt = 0;
while (!stl.empty()){
v = stl.top();
stl.pop();
for (list<int>::iterator it = Adj[v].begin(); it != Adj[v].end(); it++) {
inDegree[*it]--;
if (inDegree[*it] == 0)
stl.push(*it);
}
vec.push_back(v);
cnt++;
}
if (vec.size() != inDegree.size())
{
cout << "图中存在环路\n";
return;
}
for(int i =0 ; i<cnt;i++){
cout<<vec[i]<<" ";
}
}
int main() {
CreatGraph();
TopSort();
return 0;
}