C++ 拓扑排序

来源:互联网 发布:持仓异动指标源码 编辑:程序博客网 时间:2024/04/29 23:10

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


#include<iostream>#include<deque>#define MAX_VERTEX 100using namespace std;//liststruct 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;} 


原创粉丝点击