• lintcode-127-拓扑排序


    127-拓扑排序

    给定一个有向图,图节点的拓扑排序被定义为:
    对于每条有向边A--> B,则A必须排在B之前  
    拓扑排序的第一个节点可以是任何在图中没有其他节点指向它的节点  
    找到给定图的任一拓扑排序

    注意事项

    你可以假设图中至少存在一种拓扑排序

    说明

    Learn more about representation of graphs

    样例

    对于下列图:
    这个图的拓扑排序可能是:
    [0, 1, 2, 3, 4, 5]
    或者
    [0, 2, 3, 1, 5, 4]
    或者
    ....

    挑战

    能否分别用BFS和DFS完成?

    标签

    LintCode 版权所有 Geeks for Geeks Topological Sort 深度优先搜索 宽度优先搜索

    思路

    使用广度优先搜索,首先统计图中所有节点的入度,若入度为0,则此结点无前驱,可以将其输出,之后,将此结点所有后继节点的入度减1

    code

    /**
     * Definition for Directed graph.
     * struct DirectedGraphNode {
     *     int label;
     *     vector<DirectedGraphNode *> neighbors;
     *     DirectedGraphNode(int x) : label(x) {};
     * };
     */
    class Solution {
    public:
        /**
         * @param graph: A list of Directed graph node
         * @return: Any topological order for the given graph.
         */
        vector<DirectedGraphNode*> topSort(vector<DirectedGraphNode*> graph) {
            // write your code here
            int size = graph.size(), i = 0;
            if(size <= 0) {
                return vector<DirectedGraphNode*>();
            }
    
            vector<DirectedGraphNode*> result;
            queue<DirectedGraphNode*> noPreNode;
            map<DirectedGraphNode*, int> nodeIndegree;
    
            getIndegree(graph, nodeIndegree);
    
            for(i=0; i<size; i++) {
                if(nodeIndegree[graph[i]] == 0) {
                    noPreNode.push(graph[i]);
                }
            }
    
            while(!noPreNode.empty()) {
                result.push_back(noPreNode.front());
                for(i=0; i<noPreNode.front()->neighbors.size(); i++) {
                    if(--nodeIndegree[noPreNode.front()->neighbors[i]] == 0) {
                        noPreNode.push(noPreNode.front()->neighbors[i]);
                    }
                }
                noPreNode.pop();
            }
            return result;
        }
    
        void getIndegree(vector<DirectedGraphNode*> graph, map<DirectedGraphNode*, int> &nodeIndegree) {
            int size = graph.size();
            for(int i=0; i<size; i++) {
                int size2 = graph[i]->neighbors.size();
                for(int j=0; j<size2; j++) {
                    nodeIndegree[graph[i]->neighbors[j]]++;
                }
            }
        }
    };
    
  • 相关阅读:
    Java之static作用的深度总结
    关于UiAutomator无法识别的元素
    pom.xml详解
    maven的依赖范围scope
    maven-surefire-plugin插件
    remote origin already exists解决办法
    resin启动报错:guava-15.0.jar!/META-INF/beans.xml:5: <beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"> is an unexpected top-level tag. 异常
    Mysql存储过程
    ical4j 实现ICS文件的生成和解析
    设计模式之观察者模式
  • 原文地址:https://www.cnblogs.com/libaoquan/p/7216894.html
Copyright © 2020-2023  润新知