什么是有向无环图?
有向无环图(Directed Acyclic Graph)DAG,即图为有向图,且图中没有回环,常常用来表示事件的先后循序与依赖关系
给定
有向无环图 [V1,V2] [V3,V4] ... ... [Vn-1,Vn], Vn表示为图中的第n个顶点(Vertex),[Vn-1,Vn] 表示在Vn-1到Vn存在一条有向边由Vn-1指向Vn,请判断该图是否为有向无环图
思考
顶点的度:与该顶点相关联的边的数量
顶点的入度:图中指向该顶点的边的数量
顶点的出度:图中由该顶点出发的边的数量
有向无环图中不存在回环,我们可以利用广度优先遍历(Breadth-First-Search)先从入度为0的顶点入手,将入度为0的顶点加入队列,依次弹出队列中顶部的顶点,将由该顶点出发的边指向的顶点的入度-1,如果由该顶点A出发的边指向的顶点B的入度-1之后的入度变为0则将该顶点B加入队列中,直到图中的所有顶点都加入队列中并弹出队列即可判断该图为有向无环图,即对该图进行拓扑排序
因此我们需要以下数据结构
vector<int> degree 用于存放每个顶点的入度
map<int,vector<int>> 用于存放由每个顶点出发的边指向的顶点
queue<int> zeroDegreeQueue 用于存放入度为0的节点