拓扑排序

爱⌒轻易说出口 提交于 2020-03-09 12:15:51

拓扑排序是针对有向无环图的,当然也可以用它来检测到底有没有环,数据结构中学过其构成原理,这里就不再赘述,主要来讲他的实现。
分析原理,其实他的过程有点类似于层次遍历,所以用队列存储入度为0的点是OK的,但其实只要每次入队的结点入度为0,也没有顺序要求,栈也行,这里我为了避免每次比较麻烦,直接用优先队列实现。

#include<iostream> 
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;


int G[51][51];
int indegree[51]={0};
int num[51];//存储拓扑排序顺序
struct cmp{
	bool operator()(const int a,const int b)const{
	return indegree[a]>indegree[b];}
};


bool topologicalsort(int n){
	priority_queue<int,vector<int>,cmp>q; 
	//优先队列存储入度下标,按从小到大排序
	for(int i=1;i<=n;i++)//全部入队
	q.push(i);
	int i=1;
	while(!q.empty()){ //只要队空,拓扑完成
		int t=q.top();q.pop();
		if(indegree[t]!=0)//队首元素入度不为0,失败
		return false;
		num[i++]=t;
		for(int j=1;j<=n;j++) 
		if(G[t][j]!=0)
		indegree[j]--;
	}
   return true;
}


int main(){
	int n,x;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
	{
		scanf("%d",&x);
		G[i][j]=x;
		if(x!=0)indegree[j]++;
	}
	if(topologicalsort(n)){
		for(int i=1;i<=n;i++)
		printf("%d ",num[i]-1) ;
		printf("\n");
	}
	else printf("ERROR");
	return 0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!