拓扑排序简介:
拓扑排序是对有向无环图的顶点的一种排序,它使得如果存在一条从Vi到Vj的路径,那么在排序中Vi在Vj的前面。
如果图中含有回路,那么拓扑排序是不可能的。
此外,拓扑排序不必是唯一的,任何合理的排序都可以。
对于上面的无环图:v1,v2,v5,v4,v3,v7,v6和v1,v2,v5,v4,v7,v3,v6都是合理的拓扑排序。
一个简单的求拓扑排序的思路:
1、先找出任意一个没有入边的顶点
2、然后显出该点,并将它和它邻接的所有的边全部删除。
3、然后,对图中其它部分做同样的处理。
图用邻接表表示法来存储:
左边的数组此时就有用了,用来保存每个顶点的信息,该数组中每个元素的数据结构为:
//保存每个顶点信息的数据结构
struct GraphNode{
int vertex;//当前顶点的标号
int inDegree;//当前顶点的入度
int topNum;//当前顶点的拓扑排序的顺序标号
};
图的邻接表示法的类的接口:
/*******************************************************
* 类名称: 邻接表图
********************************************************/
class Graph{
private:
int edge_num;//图边的个数
int vertex_num;//图的顶点数目
list<Node> * graph_list;//邻接表
vector<GraphNode> nodeArr;//保存每个顶点信息的数组
public:
Graph(){}
Graph(char* graph[], int edgenum);
~Graph();
void print();
vector<int> topoSort();//拓扑排序
private: