超好理解的图论算法——拓扑排序

所谓拓扑排序也就是有向无环图,它可以检验一个有向图中是否存在回路,具体的操作方法就是

(1)在有向图中选一个没有前驱的顶点并且输出
(2)从图中删除该顶点和所有以它为尾的弧,即删除所有与它有关的边。
(3)重复上述两步,直至全部顶点均已输出;或者当图中不存在无前驱的顶点为止。

借用博主的图片理解拓扑排序https://blog.csdn.net/qq_40693171/article/details/100536278?

  • 1:删除1或2输出
    在这里插入图片描述
  • 2:删除2或3以及对应边
    在这里插入图片描述
  • 3:删除3或者4以及对应
  • 在这里插入图片描述
  • 4:重复以上规则步骤
    在这里插入图片描述
  • 具体代码如下
void topo()
{
    queue<int> q;
    for(int i=1;i<=vertexnum;i++)
    {
        if(indegree[i]==0)
        {
            q.push(i);
        }
    }
    while(!q.empty())
    {
        int temp=q.front();
        cout<<vertex[temp]<<" ";
        cnt++;
        q.pop();
        for(int i=1;i<=vertexnum;i++)
        {
            if(edge[temp][i]!=0)
            {
                indegree[i]--;
                if(indegree[i]==0)
                    q.push(i);
            }

        }
    }
    if(cnt<vertexnum)
        cout<<"有回路"<<endl;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值