拓扑排序是对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;
}