码迷,mamicode.com
首页 > 编程语言 > 详细

拓扑排序

时间:2019-10-01 13:44:41      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:span   empty   i++   mat   成功   删掉   return   ica   vector   

拓扑排序将有向无环图的所有顶点排成一个线性序列,使得其中任意两个顶点\(u、v\),若存在有向边\(u->v\),那么在线性序列中\(u\)必然在\(v\)之前。

思想:

  1. 将所有入度为0的顶点入队;
  2. 取队首结点输出,删除所有从该结点出发的边,并将这些边到达的顶点的入度减1,若某顶点入度减为0,将其入队;
  3. 重复2,直到队列为空。若进过队的结点数为\(n\),排序成功,否则图中有环
/*复杂度O(V+E)*/
int vertexNum;
vector<int> adjList[MAXV];  //邻接表 
int inDegree[MAXV];    //顶点入度,读入时记录

bool topologicalSort()
{
    int cnt = 0;
    queue<int> q;   //若有多个入度为0的顶点要选择编号最小的,可使用priority_queue
    
    //将所有入度为0的顶点入队 
    for(int i = 0;i < vertexNum;i++)
    {
        if(inDegree[i] == 0)
        q.push(i);
    }
    
    while(!q.empty())
    {
        int front = q.front();
        cout << front << endl;  //输出拓扑序列
        q.pop();
        
        for(int i = 0;i < adjList[front].size();i++)
        {
            int v = adjList[front][i];  //front的后继结点
            inDegree[v]--;
            if(indegree[v] == 0)
                q.push(v); 
        }
        adjList[front].clear();   //删掉从该顶点出发的所有边
        cnt++;
    }
    
    if(cnt == vertexNum)
        return true;
    else
        return false;
} 

拓扑排序

标签:span   empty   i++   mat   成功   删掉   return   ica   vector   

原文地址:https://www.cnblogs.com/EIMadrigal/p/11615114.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!