zoukankan      html  css  js  c++  java
  • 图论拓扑排序

    拓扑排序

    在一个有向图中,对所有的节点进行排序,要求没有一个节点指向它前面的节点。

    先统计所有节点的入度,对于入度为0的节点就可以分离出来,然后把这个节点指向的节点的入度减一。

    一直做改操作,直到所有的节点都被分离出来。

    如果最后不存在入度为0的节点,那就说明有环,不存在拓扑排序,也就是很多题目的无解的情况。

    举个栗子

    可以利用bfs来解决

        queue<int>q;
        vector<int>edge[n];
        for(int i=0;i<n;i++)  //n  节点的总数
            if(in[i]==0) q.push(i);  //将入度为0的点入队列
        vector<int>ans;   //ans 为拓扑序列
        while(!q.empty())
        {
            int p=q.front(); q.pop(); // 选一个入度为0的点,出队列
            ans.push_back(p);
            for(int i=0;i<edge[p].size();i++)
            {
                int y=edge[p][i];
                in[y]--;
                if(in[y]==0)
                    q.push(y);  
            }
        }
        if(ans.size()==n)   
        {
            for(int i=0;i<ans.size();i++)
                printf( "%d ",ans[i] );
            printf("\n");
        }
        else printf("No Answer!\n");   //  ans 中的长度与n不相等,就说明无拓扑序列
    

    参考博客

    https://blog.csdn.net/qq_41713256/article/details/80805338

  • 相关阅读:
    PHP文件系统处理
    JavaScript数据类型
    JavaScript操作符
    JavaScript语法
    在 HTML 中使用JavaScript
    JavaScript概述
    PHP数组
    PHP基本语法
    Eclipse署动态web项目方法
    xml约束技术之dtd
  • 原文地址:https://www.cnblogs.com/hezongdnf/p/12362635.html
Copyright © 2011-2022 走看看