template<typename T> bool ALGraph<T>::TopoSort(vector<T> &topo) { vector<int> indegree(m_N, 0); //---存放每个顶点的入度 //---统计每个顶点的入度 for(int i = 0; i < m_N; i ++) for(ArcNode *p = m_Data[i].firstarc; p; p = p->nextarc) indegree[p->adjvex] ++; stack<int> S; //---存放入度为零的所有顶点的序号 //---将所有入度为零的顶点序号压栈 for(int i = 0; i < m_N; i ++) { if(indegree[i] == 0) S.push(i); } while(!S.empty()) { int out = S.top(); S.pop(); topo.push_back(m_Data[out].data); //---将入度为零的顶点的数据压入topo序列 for(ArcNode *p = m_Data[out].firstarc; p; p = p->nextarc) { indegree[p->adjvex] --; //---将以top为顶点的弧的尾点入度减一 if(indegree[p->adjvex] == 0) //---入度为零以后压栈 S.push(p->adjvex); } } if(topo.size() < m_N) //---比较拓扑序列元素个数与顶点数目 return false; return true; }
拓扑排序
最新推荐文章于 2022-06-01 13:11:23 发布