注:本文只提供一个基本的简明的解决方案,至于如何理解拓扑排序,题目与拓扑排序之间更深层的联系等不作讨论。
题目:https://dsa.cs.tsinghua.edu.cn/oj/problem.shtml?id=1147
分析:
题目提示使用拓扑排序,那么算法一定是基于拓扑排序的框架再加一些额外的操作,于是有两个关键点,写对了,就能满分:
1.拓扑排序:
策略:将所有入度为0的顶点入栈,弹出栈顶元素,若此元素存在入度为1的邻居,将其入栈并将此邻居的入度-1,重复直到栈空。
实现:
void TSort(){
for(int k=0;k<n;k++)if(!adjList[k].in)stack[++top]=k;
while(top){
int v=stack[top--];
for(ENode *p=adjList[v].fstEdge;p;p=p->succ){
if(!(--adjList[p->vsub].in))stack[++top]=p->vsub;
}
}
}
2.将题意与拓扑排序结合:
题目需要求的变量可等效地理解为求图的最大路径上的顶点数,注意到根据此题,顶点数=路径长度+1,于是问题转换为求图的最大路径长度,而图的最大路径长度就是到所有顶点的最大路径长