题意:
给出第i行的孩子标号,构成一个族谱,在族谱的最上端话语权就高,问从大到小输出
思路:
拓补排序,用图的边维护关系,每次找入度为0的点,然后重新维护关系
#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std;
int mp[105][105];
int vis[105];
int in[105];
int ans[105];
int n;
void top_sort()
{
for(int k=1;k<=n;k++)
{
int index=-1;
for(int i=1;i<=n;i++)
{
if(!vis[i]&&in[i]==0)
{
index=i;
break;
}
}
vis[index]=1;
ans[k]=index;
for(int i=1;i<=n;i++)
{
if(mp[i][index])
{
in[i]--;
}
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int cnt=1;
int num;
while(cin>>num&&num)
{
mp[i][num]=1;
in[i]++;
}
}
top_sort();
cout<<ans[n];
for(int i=n-1;i>0;i--)
cout<<" "<<ans[i];
}