题373.拓扑排序-acwing-Q1191–家谱树
一、题目
二、题解
题目要求输出一个序列使得每个人的孩子比那个人后列出,其实就是输出一个拓扑序。则直接套拓扑排序板子即可。
本题代码如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn=110,maxm=1e4+1;
int n;
int h[maxn],e[maxm],ne[maxm],idx;
int d[maxn];
void add(int a,int b)
{
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void topSort()
{
queue<int> q;
for(int i=1;i<=n;i++)//将所有度为0的节点先入队
{
if(!d[i])
{
q.push(i);
}
}
while(!q.empty())
{
int t=q.front();
q.pop();
cout<<t<<" ";
for(int i=h[t];i!=-1;i=ne[i])
{
int j=e[i];
if(--d[j]==0)//将输出的节点的邻接点的度数-1,看度数是否为0,如果为0则入队
{
q.push(j);
}
}
}
}
int main()
{
cin>>n;
memset(h,-1,sizeof h);
for(int i=1;i<=n;i++)
{
int b;
while(cin>>b,b)
{
add(i,b);
d[b]++;//统计节点度数
}
}
topSort();
}
三、关于拓扑排序
如何输出字典序最小的拓扑序列?
将队列换成优先队列,优先队列取出的元素是当前字典序最小的编号,在出队的时候记录出队的编号即为当前字典序最小的拓扑序,此方法的时间复杂度是O(logn∗(n+m))