拓扑排序(学习笔记)

对一个有向无环图(DAG)进行拓扑排序。
实现:
1.在有向图中选一个没有前驱的顶点并且输出
2.从图中删除该顶点和所有出边
3.重复1、2步骤,直至所有顶点输出
初始化:

vector<int>vec[maxn];
scanf("%d%d",&n,&m);//n个点,m条边
int n,m,u,v;
int InDeg[maxn];//入度 
while(m--){
	scanf("%d%d",&u,&v);
	vec[u].push_back(v);
	InDeg[v]++;
}

判断是否有环:

queue<int>q; 
int num;//统计排好序的元素个数 
bool topsort(){
	for(int i=1;i<=n;i++){
		if(!InDeg[i]) q.push(i);
	}
	while(!q.empty()){
		int now=q.front();
		q.pop();
		num++;
		for(int i=0;i<vec[now].size();i++){
			if(--InDeg[vec[now][i]]==0)
				q.push(vec[now][i]);
		}
	}
	if(num==n) return true;//无环 
	else return false;//有环 
}

版权声明:本文为GW_Krystal原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/GW_Krystal/article/details/105893582