典型拓扑排序,使用广搜BFS,建立队列,将入度为0的结点入列,先出来的就是辈分大的
代码实现:
#include <bits/stdc++.h>
using namespace std;
const int N=1e3+5;
vector<int> p[N];//建图
int ans[N];//答案数组
int m,d[N];//m计数,d[N]是入度
int n;//因为拓扑排序中要用到节点数量n,在主函数外开
void tuopu(){
queue<int> q;
for (int i = 1; i <= n; i++)
if (d[i] == 0)
q.push(i);//将入度为0的节点入队
while (!q.empty())
{
int f = q.front();
ans[++m] = f;
q.pop();
for (int i=0;i<p[f].size();i++)//遍历入列的节点的相连节点
{
int t=p[f][i];
d[t]--;//入度减
if (d[t] == 0)
q.push(t);
}
}
}
int main() {
cin>>n;
for(int i=1;i<=n;i++)//按题意常规输入
while(1)
{
int x;
cin>>x;
if(x!=0){
p[i].push_back(x);
d[x]++;}
else break;
}
tuopu();
for(int i=1;i<=n;i++)
cout<<ans[i]<<" ";
return 0;
}