关闭

拓扑排序(学习)

280人阅读 评论(0) 收藏 举报
分类:

拓扑排序:

拓扑排序是对有向无环图的一种排序。
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若 < u,v > ∈ E(G),则u在线性序列中出现在v之前。
通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。

AOV网构造拓扑序列的拓扑排序算法主要是循环执行以下两步,直到不存在入度为0的顶点为止。
(1) 选择一个入度为0的顶点并输出之;

(2) 从网中删除此顶点及所有出边。

循环结束后,若输出的顶点数小于网中的顶点数,则输出“有回路”信息,否则输出的顶点序列就是一种拓扑序列。


实现

邻接矩阵:v*v

    bool G[N][N];           //邻接矩阵存图
    int in[N];              //各个顶点的入度 计数
    void toposort(int n)    //拓扑排序
    {
        int k=0;
        for(int i=1; i<=n; i++)     //共进行|G.V|次操作
        {
            for(int j=1; j<=n; j++) //遍历所有的顶点 找入度为0的
            {
                if(in[j]==0)        //找到
                {
                    printf("%d%c",j,i==n?'\n':' ');
                    in[j]--;        //去掉这个点  让in[j] = -1;
                    k=j;            //记录这个点
                    break;          //跳出循环
                }
            }
            for(int j=1; j<=n; j++) //遍历所有的点
                if(G[k][j]==1)      //找被此点打败过的点
                {
                    G[k][j]=0;      //标记为找到过
                    in[j]--;        //让这个点的入度-1
                }
        }
    }

前向星:v+e

    struct node     //前向星的结构体
    {
        int v;      //输队编号
        int next;
    }edge[N*4];     //结构体数组
    int head[N];    //头指针数组
    int cnt;        //下标
    int in[N];      //入度数组
    void toposort(int n)
    {
        priority_queue<int,vector<int>,greater<int> >que;   //优先队列
        for(int i=1; i<=n; i++)     //找所有点
        if(in[i]==0)                //入度为 0
        {
            que.push(i);            //加入队列
            in[i]--;                //入度 变为 -1
        }
        int k=1;
        while(!que.empty())         //队列不为空
        {
            int u=que.top();        //取出队首的数
            que.pop();              //删除
            printf("%d%c",u,k++==n?'\n':' ');
            for(int i=head[u]; i!=-1; i=edge[i].next)   //与该点相连的
            {
                node e=edge[i];     //便于书写
                in[e.v]--;          //点的入度 -1
                if(in[e.v]==0)      //若此点的 入度为 0
                    que.push(e.v);  //放入队列
            }
        }
    }

STL: v+e

    vector<int>G[N];    //vector模拟邻接表
    int n,in[N];        //in[]保存每个顶点的入度
    void toposort()
    {
        priority_queue <int,vector <int>,greater<int> > Q;  //优先队列队列元素从小到大
        for(int i=1; i<=n; i++)
        if(in[i] == 0)  //入度为0的都压入队列
            Q.push(i);
        int flag=0;
        while(!Q.empty())   //BFS思想
        {
            int v=Q.top();  //取队顶的那个点遍历
            Q.pop();        //删掉该点
            if(!flag)
                cout<<v;
            else
                cout<<" "<<v;
            flag=1;
            for(int i=0; i<G[v].size(); i++)                //遍历与该点相邻的点
            {
                in[G[v][i]]--;                              //与它相连的点的入度都要减1
                if(!in[G[v][i]])                            //入度为0压入队列
                Q.push(G[v][i]);
            }
        }
        puts("");
    }
}

以上代码不是自己敲的

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

拓扑排序学习总结

a.简介: 拓扑排序主要用来解决满足一个给定图的各个结点的顺序问题。因此如何从实际问题中抽象出图是解决问题的关键。b.主要步骤: 1.选择当前入度为0的节点,去除; 2....
  • DTL66
  • DTL66
  • 2016-08-06 01:13
  • 218

ACM-图论-拓扑排序

拓扑排序用于解决图论中有向图的一类序列问题。即在某一个有向图graph中,假设每一条有向边(u,v)代表节点u必须排在节点v的前面,那么按照这样的规则,将所有的节点进行排序,最终得出的序列就称为拓扑序...
  • u011787119
  • u011787119
  • 2015-08-03 16:10
  • 1378

拓扑排序算法原理以及完整的C代码实现

拓扑排序定义 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在...
  • u014488381
  • u014488381
  • 2014-11-26 15:58
  • 5163

算法8-10:最短路径算法之拓扑排序

该算法的基本思想就是按照拓扑排序的顺序依次将每个顶点加入到最短路径树中,每次加入时将该顶点延伸出的所有顶点进行“放松”操作。这种算法的复杂度是E+V。 代码 这种算法的...
  • caipeichao2
  • caipeichao2
  • 2014-06-26 21:04
  • 1317

hdu 拓扑排序 题目归纳

拓扑排序 定义和前置条件: 定义:将有向图中的顶点以线性方式进行排序。即对于任何连接自顶点u到顶点v的有向边uv,在最后的排序结果中,顶点u总是在顶点v的前面。 ...
  • Simon_coder
  • Simon_coder
  • 2016-06-01 17:57
  • 3337

拓扑排序 详解

本文链接   :http://www.cnblogs.com/Yan-C/p/3943940.html  1、 拓扑排序   我们起床穿裤子和鞋子时,相信大部分人的顺序是这样的,先穿上内裤,然后...
  • Turne
  • Turne
  • 2015-12-03 20:20
  • 2257

图拓扑排序的两种方法实现

方法一: (1)在有向图中选一个没有前驱(入度为0)的点输出。 (2)从图中删除该顶点和所有以它为尾的弧。 重复以上步骤,直至全部顶点均已输出,或者当前图中不存在五前驱的顶点为止。 ...
  • jbfsdzpp
  • jbfsdzpp
  • 2015-09-10 11:13
  • 619

JAVA实现拓扑排序

折腾了很久才实现的拓扑排序,把代码和思路整理一下: 拓扑排序是用来对有向无环图进行排序的,和图的广度优先遍历类似,主要是利用队列把节点的入度为0(就是没有指向该节点的节点,只有从节点发出的)...
  • qq_20991785
  • qq_20991785
  • 2015-03-13 14:32
  • 740

拓扑排序及其Java实现

拓扑排序是针对有向无圈图的顶点的一种排序,使得如果存在一条从A到B的路径,那么在排序中A必定在B的前面。 拓扑排序的应用场景很好理解,比如在内存中运行着很多任务,某个任务A的执行依赖于另外一...
  • sinat_22013331
  • sinat_22013331
  • 2016-07-27 16:14
  • 1723

拓扑排序——用C++中STL实现

最近学习了拓扑排序,发现网上很多人对它的实现比较复杂,无论是在编程比赛,还是在实际开发中都比较耗费时间,所以用C++中STL实现该算法的好处就不言而喻! 首先简单介绍一下拓扑排序算法: 拓扑排序算法主...
  • lrgdongnan
  • lrgdongnan
  • 2016-06-15 11:35
  • 3475
    个人资料
    • 访问:52646次
    • 积分:3487
    • 等级:
    • 排名:第11057名
    • 原创:313篇
    • 转载:8篇
    • 译文:0篇
    • 评论:6条