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