裸的拓扑排序。
#include <iostream> #include<stdio.h> #include<cstring> #include<vector> using namespace std; vector<int>a[105]; int from[105],to[105],flag[105];//出度,入度,标记是否访问过 int main() { int n,temp; scanf("%d",&n); memset(from,0,sizeof(from)); memset(to,0,sizeof(to)); memset(flag,0,sizeof(flag)); for(int i=1;i<=n;i++){ while(scanf("%d",&temp),temp){ a[i].push_back(temp); from[i]++; to[temp]++; } } int count=0; while(count!=n){ for(int i=1;i<=n;i++){ if(to[i]==0&&flag[i]==0){ count++; printf("%d ",i); flag[i]=1; int len=a[i].size(); for(int j=0;j<len;j++){ to[a[i][j]]--; } } } } printf("\n"); return 0; }