`
阿尔萨斯
  • 浏览: 4170500 次
社区版块
存档分类
最新评论

拓扑排序

 
阅读更多

拓扑排序

对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。

一个有向图无法拓扑排序时只有一种情况:该有向图中存在环.刘汝佳入门经典P111中给出了拓扑排序的代码,其中关键点在于状态数组C[i]的使用.代码如下,具体细节自己体会:

/*刘汝佳 入门经典P110
有向图拓扑排序,输入数据为:
5 4
0 1
1 2
2 3
4 3
输出为:4 0 1 2 3
4 4
0 1
1 2
2 3
3 0
输出为:存在有向环,无法拓扑排序
*/

#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=100+5;
int G[maxn][maxn];//有向图
int n,m;//n为点数,m为边数
int c[maxn];//为-1,0,1 分别表示当前点的3中状态:正在被访问,未被访问,已访问完
int topo[maxn];//拓扑排序的结果,正序存放
int t;//用于计数topo结果当前位置
bool dfs(int u)
{
    c[u]=-1;
    for(int v=0;v<n;v++)if(G[u][v])
    {
        if(c[v]<0) return false;
        if(!c[v]&&!dfs(v)) return false;
    }
    c[u]=1;
    topo[--t]=u;//当u点所指的所有其他节点都拓扑完,就可以把u保存在当前的一个靠前的位置了
    return true;
}

bool toposort()
{
    t=n;
    memset(c,0,sizeof(c));
    for(int i=0;i<n;i++)if(!c[i])//节点从0到n-1编号
        if(!dfs(i)) return false;
    return true;
}

int main()
{
    while(scanf("%d%d",&n,&m)==2&&n&&m)
    {
        memset(G,0,sizeof(G));
        for(int i=0;i<m;i++)
        {
            int u, v;
            scanf("%d%d",&u,&v);
            G[u][v]=1;
        }
        if(!toposort()) printf("存在有向环,无法拓扑排序\n");
        else
        {
            for(int i=0;i<n;i++)
                printf("%d ",topo[i]);
            puts("");
        }
    }
    return 0;
}

如果想要按字典序从小到大输出所有可能的拓扑排序结果,可以看POJ1270题解:

http://blog.csdn.net/u013480600/article/details/30315289

其实判断有向图能否拓扑排序且输出拓扑排序的结果还有另一种非递归的简单方式,该方法更好理解:

http://blog.csdn.net/u013480600/article/details/30516301

注意:如果简化有向图的过程中,出队列的点(即最终入度为0的点)个数<n,说明该图无法简化,也就无法拓扑排序.可见数据结构C语言版(严蔚敏版)

分享到:
评论

相关推荐

    数据结构拓扑排序课程设计.docx

    课题二 拓扑排序 2.1 问题的提出2.1 问题的提出 任务:编写函数实现图的拓扑排序。 程序所实现的功能: 建立对应的邻接表,对该图进行拓扑排序,并显示排序结果。 输入: 顶点数, 边数及各顶点信息(数据格式为整形...

    操作系统 拓扑排序算法

    任意给定一个有向图,设计一个算法,对它进行拓扑排序。拓扑排序算法思想:a.在有向图中任选一个没有前趋的顶点输出;b.从图中删除该顶点和所有以它为尾的弧;c.重复上述a、b,直到全部顶点都已输出,此时,顶点输出...

    拓扑排序 整体 拓扑排序

    拓扑排序拓扑排序拓扑排序拓扑排序拓扑排序拓扑排序拓扑排序拓扑排序拓扑排序

    有向图的拓扑排序

    对于有向图进行拓扑排序,图使用邻接矩阵的存储结构。

    c语言实现图的拓扑排序

    C语言实现图的拓扑排序

    c++实现拓扑排序

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

    简单拓扑排序——源码

    拓扑排序源码,程序简单易懂,注释详细。希望对学习数据结构的朋友有所帮助。

    拓扑排序关键路径算法C语言完整代码

    拓扑排序关键路径算法C语言完整代码,vs2013下编译运行通过

    拓扑排序-课程设计(源码、课程设计说明书)

    题目内容:输出有向网的拓扑排序序列。 拓扑排序的基本思想为: 1)从有向图中选出一个无前驱的顶点输出; 2)将此顶点和以他为起点的弧删除; 3)重复1)2)直到不存在无前驱的顶点; 4)若此时输出的顶点数小于有...

    拓扑排序与关键路径(C++版)

    拓扑排序与关键路径,在日常生活中,一项大的工程可以看作是由若干个子工程(这些子工程称为“活动” )组成的集合,这些子工程(活动)之间必定存在一些先后关系,即某些子工程(活动)必须在其它一些子工程(活动...

    数据结构课设拓扑排序源代码(教学计划安排)

    数据结构课设报告,包括完整源代码,用拓扑排序算法安排有先后制约关系的课程的教学计划。

    AOV网与拓扑排序

    C实现的拓扑排序,有详细注释,有问题的我们一起讨论

    图的最短路径、拓扑排序和关键路径

    图的最短路径、拓扑排序和关键路径相关算法描述,有c++code

    拓扑排序 数据结构 c和 C++源程序代码

    拓扑排序 数据结构 c和 C++源程序代码 拓扑排序 数据结构 c和 C++源程序代码

    基于邻接表存储的图的拓扑排序算法

    基于邻接表存储的图的拓扑排序算法,学习C++和理解数据结构很有帮助

    拓扑排序和关键路径课设

    阅读了《数据结构(C语言)》的经典著作后...本次算法课程设计运用所学的图论的拓扑排序和关键路径,去实现工程中的花费时间和顺利进行问题。拓扑排序主要用于检验工程能否施工,关键路径主要用于看出工程施工时间消耗。

    C# 图 拓扑排序

    C# 图 拓扑排序

    图(拓扑排序)

    【拓扑排序】 任务:编写函数实现图的拓扑排序。 ........................................................................................................................

    图 拓扑排序 深度搜索 广度搜索 最小生成树

    图 拓扑排序 深度搜索 广度搜索 最小生成树

    拓扑排序--课程表

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

Global site tag (gtag.js) - Google Analytics