拓扑排序

思路:找入度为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;

}

原文地址:https://www.cnblogs.com/cbyniypeu/p/3388794.html