AOV网为有向图,用其表示一项工程,则顶点表示活动,弧表示活动之间的优先关系。此时AOV网中不能出现回路,否则会出现某活动开始是以自身为先决条件这样的问题。拓扑排序就是用以测试AOV网是否存在回路的方法。拓扑排序适合图的邻接表存储形式。
拓扑序列:对有向图G=(V,E),V中顶点序列v0,v1,...,vn-1为拓扑序列,当且仅当满足:若从顶点vi到vj存在一条路径,则在顶点序列中vi一定在vj之前。
/*边表结点*/
struct ArcNode
{
int adjvex;
ArcNode* next;
};
/*顶点表结点
按需要在顶点表加入某顶点的入度*/
template<class DataType>
struct VertexNode
{
DataType vertex;
int in;
ArcNode* first;
};
/*邻接表*/
template <class DataType>
class ALGraph
{
friend void TopSort(ALGraph<DataType>&);
public:
ALGraph(std::vector<DataType>& a, int n)
{
vertex_num = n;
for (int i = 0; i < vertex_num; ++i)
{
VertexNode<DataType> temp;
temp.vertex = a[i];
temp.first = NULL;
temp.in = 0;
adjlist.push_back(temp);
}
int i, j;
int l;
while (cin >> i >> j >> l)
{
if (i == -1)
break;
ArcNode *s;
s = new ArcNode;
s->adjvex = j;
s->next = adjlist[i].first;
adjlist[i].first = s;
++adjlist[j].in;
}
}
~ALGraph()
{
for (int i=0; i < vertex_num; ++i)
{
ArcNode* q;
while (adjlist[i].first != NULL)
{
q = adjlist[i].first;
adjlist[i].first = adjlist[i].first->next;
delete q;
}
}
}
private:
std::vector<VertexNode<DataType>> adjlist;//顶点表
size_t vertex_num;
};
/*拓扑排序
1.将所有入度为0的点入栈
2.栈顶元素i出栈,输出i
3.对i的每一个邻接点k的入度-1;若k的入度为0,入栈
4.重复2,3直到所有点被遍历*/
void TopSort(ALGraph<int>& G)
{
list<int> S;//栈S
int count = 0;
for (size_t i