【数据结构】拓扑排序 Kahn版和DFS版

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;
} 

猜你喜欢

转载自blog.csdn.net/qq_39072627/article/details/107690071