点击查看代码
#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存在环,拓扑排序失败
}