#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
const int MAXV = 1000;
vector<int> G[MAXV]; //邻接表
int n, m, inDegree[MAXV]; //顶点数、入度
//拓扑排序
bool topologicalSort(){
int num = 0; //记录加入拓扑序列的顶点数
queue<int> q;
for(int i = 0; i < n; i++){
if(inDegree[i] == 0){
q.push(i); //将所有入度为0的顶点入队
}
}
while(!q.empty()){
int u = q.front(); //取队首顶点u
q.pop();
for(int i = 0; i < G[u].size(); i++){
int v = G[u][i]; //u的后继结点v
inDegree[v]--; //顶点v的入度减1
if(inDegree[v] == 0){ //顶点v的入度减为0则入队
q.push(v);
}
}
G[u].clear(); //清空顶点u的所有出边
num++; //加入拓扑序列的顶点数加1
}
if(num == n) return true; //加入拓扑序列的顶点数为n,说明拓扑排序成功,有向无环图
else return false; //加入拓扑序列的顶点数小于n,说明拓扑排序失败,图中有环
}
int main(){
return 0;
}
拓扑排序-判断有向无环图
最新推荐文章于 2022-01-14 12:16:57 发布