Kahn版 TopologicalSort:
const int NUM = 10;
vector<int> v[10],ans_path;//其中v[]是用邻接表存储的一个图。
int degree[NUM];
int N,M;//图节点从1~N , 边数一共有M条
//其中v[]是用邻接表存储的一个图。
bool TopologicalSort(){
stack<int> S;
for(int i=1;i<=N;i++){
for(int j = 0; j<v[i].size(); j++){
degree[v[i][j]]++;
}
}
for(int i=1;i<=N;i++){
if(degree[i]==0) S.push(i);
}
while(!S.empty()){
int p = S.top();
S.pop();
ans_path.push_back(p);
for(int i = 0;i<v[p].size();i++){
degree[v[p][i]]--;
if(degree[v[p][i]] == 0) S.push(v[p][i]);
}
}
if(ans_path.size()<N) return false;
else return true;
}
DFS版 Aniti_TopologicalSort(已确保该图是一个有向无环图)求得的结果是一个逆拓扑序列
const int NUM = 10;
vector<int> v[10],ans_path;
int N,M;//图节点从1~N , 边数一共有M条
bool visited[NUM];
void _TopplogicalSort_DFS(int t){
visited[t] = true;
for(int i=0;i<v[t].size();i++){
if(visited[v[t][i]] == false)
_TopplogicalSort_DFS(v[t][i]);
}
ans_path.push_back(t);
}
环路检测+TopologicalSort
color[]用来标记每一点的状态:
color[v] = 0表示还没有被访问,
color[v] = -1 表示 v 正在被访问(正在访问v及其后继节点)。
color[v] = 1表示 v 已经被访问完了,之后不会再回溯到该点了。
color[]初始化全为0;
/*
color[]用来标记每一点的状态:
color[v] = 0表示还没有被访问,
color[v] = -1 表示 v 正在被访问(正在访问v及其后继节点)。
color[v] = 1表示 v 已经被访问完了,之后不会再回溯到该点了。
color[]初始化全为0;
*/
int color[NUM] = {0};
bool DFS_TopologicalSort(int t){
color[t] = -1;
for(int i = 0;i<v[t].size();i++){
int p = v[t][i];//p为t的后继节点
//表示p的前继节点还未访问完,而p便可以访问到其前继节点,表示存在环路。
if(color[p] == -1) {
return false;
}
if(color[p] == 0)
{
bool flag = DFS_TopologicalSort(p);
if(flag == false) return false;
}
}
color[t] = 1;//该节点访问完毕,标记为1。
ans_path.push_back(t);
return true;
}