名称:拓扑排序

/*
名称:拓扑排序
说明:对于拓扑排序来说,其针对的一般是AOV网。其基本的算法(本程序中实现的)类似于广度优先遍历只不过在遍历的时候要修改顶点的入度数量。当某个顶点的入度数量为0时,则说明可以输出其顶点,并把以此顶点为源点的弧删去(也就是以此弧为终点的顶点的入度数减1)。
在本程序中使用的是临接矩阵的结构,时间复杂度为O(V2)。实际上比较好的存储结构是用逆临接表,可以达到O(V+E)的时间复杂度。

*/

#include<iostream>
#include "graph.h"
using namespace std;

//拓扑排序
bool TopologicalSort(MGraph G)
{
    int indegree[G.vexnum];     //用来记录每个顶点的入度个数

    queue<int > Q;          //保存入度为0的顶点

    memset(indegree,0,sizeof(indegree));        //初始化为0

    int val = 0;
    int _count = 0;     //用来记录输出的顶点个数

    //前期准备:计算个顶点的入读(采用的是临接矩阵)
    for(int i = 0;i<G.vexnum;++i)
    {
        for(int j = 0;j<G.vexnum;++j)
        {
             if(G.Edge[j][i] > 0 && G.Edge[j][i] < MaxDis)
             {
               ++(indegree[i]);         //顶点的入度个数加1
             }
        }

        if(indegree[i] == 0)        //将入度为0的顶点推入队列
            Q.push(i);
    }

    while(Q.empty() == false)
    {
        val = Q.front();
        Q.pop();

        _count++;
        cout<<GetVex1(G,val)<<" ";     //输出顶点
        for(int p = FirstNeighbor1(G,val); p >= 0;p = NextNeighbor1(G,val,p))
        {
            if((--indegree[p]) == 0)
                Q.push(p);
        }
    }
    if(_count < G.vexnum)       //如果最终输出顶点数量小于图的数量,则说明图中有环,排序失败
        return false;
    else
        return true;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值