C++ 拓扑排序

拓扑排序是对AOV网排序,AOV网主要用于表示活动间的优先关系,AOV网的特征是不存在回路,且是连通图,但一定不是强连通图。拓扑排序的算法是非常简单的,借助stl deque实现。把入度为0的顶点加入队尾,头出队列,访问这个顶点,并把这个顶点相连的顶点对应的边删除,若相连的点没有入度,则把相连的点加入队尾,直到队列长度为0


#include<iostream>
#include<deque>
#define MAX_VERTEX 100

using namespace std;

//list
struct Side{  
	int index;  
	int weight;
	Side* next;
}; 
  
struct Vertex{  
	char data;
	int in_nums;
	Side* first;
};
  
typedef Vertex AdjList[MAX_VERTEX];  
  
struct AdjGraph {
	AdjList adjlist;  
	int num_vertex;  
	int num_side; 
};



int main(){
	deque<int> _queue;
	AdjGraph adjGraph;
	
	for(int i=0;i<MAX_VERTEX;i++){
		adjGraph.adjlist[i].in_nums=0;
		adjGraph.adjlist[i].data=0;
		adjGraph.adjlist[i].first=0;
	}
	
	cout<<"input vertex and side nums:";

	cin>>adjGraph.num_vertex>>adjGraph.num_side;
	
	cout<<"input vertex char data:";
	for(int i=0;i<adjGraph.num_vertex;i++){
		cin>>adjGraph.adjlist[i].data;
	}
	
	for(int i=0;i<adjGraph.num_side;i++){
		int v1;
		int v2;
		cout<<"input two vertex:";
		cin>>v1>>v2;
		
		Side* side1=new Side();
		side1->index=v2;

		if(adjGraph.adjlist[v1].first==0){
			adjGraph.adjlist[v1].first=side1;
		}
		else{
			Side* temp=adjGraph.adjlist[v1].first;
			adjGraph.adjlist[v1].first=side1;
			side1->next=temp;
		}
		adjGraph.adjlist[v2].in_nums++;
	}
	
	

	for(int i=0;i<adjGraph.num_vertex;i++){
		if(adjGraph.adjlist[i].in_nums==0){
			_queue.push_back(i);
		}
	}
	
	while(_queue.size()>0){
		
		int index=_queue.front();
		_queue.pop_front();
		
		cout<<adjGraph.adjlist[index].data<<' ';
		
		Side* first=adjGraph.adjlist[index].first;
		
		while(first!=0){
			
			adjGraph.adjlist[first->index].in_nums--;
			
			if(adjGraph.adjlist[first->index].in_nums==0){
				_queue.push_back(first->index);
			}
			
			first=first->next;
		}
	}
	
	cout<<endl;
	
	
	
	
	return 0;
} 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值