排序算法 - 拓扑排序

博客介绍了拓扑排序,其定义是根据集合上的偏序求出全序,解释了偏序和全序的概念。还阐述了AOV网的拓扑排序算法流程,即选取无前驱顶点遍历、输出、删除相关弧,直至全部顶点输出或图中无无前驱顶点,最后给出了例子和代码。

定义:根据某个集合上定义的一个偏序求出该集合上的全序

偏序:
若集合X上的关系R是自反的,反对称的和传递的,称R是集合X上的偏序

全序:
设R是集合X上的偏序关系,如果对于每个 x,y∈X 必有 xRy 或 yRx,则称R是集合X上的全序关系

通俗来讲,拓扑排序就是将集合上的元素按某种关系进行排序

AOV网的拓扑排序算法流程

  1. 在AOV网中选取一个没有前驱的顶点v开始遍历
  2. 输出顶点v
  3. 删除顶点v和所有以v为弧尾的弧
  4. 重复1~3步,直到
    1)AOV网中全部顶点都已输出(得到拓扑有序序列)
    2)或者图中再无没有前驱的顶点(AOV网中有环)

例子:
在这里插入图片描述

代码:

///* 边节点类型 */
//typedef struct ANode{
//    int adjvex;                 //该边的邻接点编号
//    struct ANode * nextarc;     //指向下一条边的指针
//    int weight;                 //该边的权值
//}ArcNode;
//
///* 头节点类型 */
//typedef struct{
//    Vertex data;            //顶点信息
//    int count;              //增加数据域:存放顶点入度
//    ArcNode* firstarc;      //指向第一个邻接点
//}VNode;
//
///* 完整的图邻接表类型 */
//typedef struct {
//    VNode adjlist[MAXV];    //邻接表的头节点数组
//    int n,e;                //图中的顶点数n和边数e
//}AdjGraph;
//
//
//void TopSort(AdjGraph *G){
//    int i,j;
//    int St[MAXV],top = -1;
//    ArcNode *p;
//    for (i=0;i<G->n;i++) G->adjlist[i].count=0;
//    for (i=0;i<G->n;i++){
//        p = G -> adjlist[i].firstarc;
//        while (p!=NULL){
//            G->adjlist[p->adjvex].count++;
//            p = p->nextarc;
//        }
//    }
//    for(i=0;i<G->n;i++)
//        if(G->adjlist[i].count==0){
//            top++;
//            St[top] = i;
//        }
//    while (top>-1){
//        i = St[top];top--;
//        p
//    }
//以后再更吧}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值