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

    思路:找入度为0的点->删边 ->重复直接找不到入度为0的点。

    #include<iostream>

    #include<vector>

    using namespace std;

     

    const int MAXN=500+10;

    int indegree[MAXN];

    vector<int>V[MAXN];

     

    void init(int n){                               //初始化

        memset(indegree,0,sizeof(indegree));

        for(int i=1;i<=n;i++){

            V[i].clear();

        }

    }

     

    int findZeroDegree(int n){        //找入度为0的点

        for(int i=1;i<=n;i++){

            if(indegree[i]==0){

                return i;

            }

        }

        return -1;

    }

     

    void cutDegree(int node){                  //相关点的入度-1

        for(int i=0; i<V[node].size(); i++){

            indegree[V[node][i]]--;

        }

    }

     

    void topSort(int n){

        int node;

        int save[MAXN];                       //存储关键路径

        int k=0;

        for(int cnt=0; cnt<n; cnt++){

            node = findZeroDegree(n);

            indegree[node] = -1;              //标志已经用过的顶点

            save[k++] = node;                 //存储找到的顶点

            cutDegree(node);

        }

        for(int i=0;i<n-1;i++){

            cout<<save[i]<<" ";

        }

        cout<<save[n-1]<<endl;

    }

  • 相关阅读:
    三点求圆心坐标(三角形外心)
    半平面交
    旋转卡壳
    平面最近点对(HDU 1007)
    凸包
    ACM做题随做随思
    最短路径——SPFA算法
    树链剖分原理
    生成树的计数——Matrix-Tree定理
    次小生成树
  • 原文地址:https://www.cnblogs.com/cbyniypeu/p/3388794.html
Copyright © 2011-2022 走看看