拓扑排序算法

点击查看代码
#include<cstdio>
#include<queue>
#pragma warning(disable:4996)
using namespace std;
const int maxn = 1000; //最多不超过1000个顶点
const int INF = 0x3fffffff; //表示无穷大

vector<int> G[maxn]; //邻接表
int n, m, inDegree[maxn]; //顶点数,边数,记录每个顶点的入度

//拓扑排序,如果图G是有向无环图则返回true,否则返回false
bool topologicalSort() { 
	int num = 0; //记录加入拓扑序列中的顶点个数
	queue<int> q; //定义队列
	for (int i = 0; i < n; i++) { //初始化将所有入度为0的顶点加进队列q中
		if (inDegree[i] == 0) {	//如果顶点i的入度为0,则将它加进队列q中
			q.push(i);
		}
	}
	while (!q.empty()) { //当队列q为空时,排序结束
		int u = q.front(); //取出队首顶点u
		q.pop(); //队首元素出队后要手动删除
		printf("%d", u); //按题目要求是否需要输出拓扑序列中的顶点
		for (int i = 0; i < G[u].size(); i++) { //枚举u的所有邻接点v,将它们的入度减一
			int v = G[u][i]; //为了方便书写将u的邻接点记作v
			inDegree[v]--; //v的入度减一
			if (inDegree[v] == 0) { //如果v的入度为0
				q.push(v); //把v加进队列q中
			}
		}
		G[u].clear(); //将邻接点v的入度都减一后,就删除u的所有出边,继续检查下一个队首顶点
		num++; //加入拓扑序列的顶点数加一
	}
	if (num == n) return true; //如果加入队列的顶点数与图中顶点数相同,拓扑排序成功,图G是有向无环图
	else return false; //否则图G存在环,拓扑排序失败
}
posted @ 2022-09-30 22:53  zhaoo_o  阅读(6)  评论(0编辑  收藏  举报