

解题思路: 一般来说树的题目可以考虑用递归算法解决,不是必须使用图结构的算法,比如树结构的两点最近距离只要找到两点公共祖先就能得到。但这个题目没有明确树根,也不明确边的方向(边方向由值决定)。所以还是用图结构的关键路径算法处理好一些。
关键路径算法和拓扑排序算法的唯一区别就是在拓扑过程中增加一条判断路径最大长度的语句。
#include <iostream>//ASI
#include<vector>
#include<queue>
typedef long long ll;
using namespace std;
int n,a[100005],d[100005],dp[100005],ans;//dp记录路径长度,d记录入度
vector<int>e[100005];
int main()
{
ios::sync_with_stdio(0),cin.tie(0);
int i,j,x,y;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
for(i=1;i<n;i++)
{
cin>>x>>y;
if(a[x]<a[y])
e[x].push_back(y),d[y]++;
else if(a[x]>a[y])
e[y].push_back(x),d[x]++;
}
queue<in

本文介绍了一种利用图结构的关键路径算法解决特定问题的方法。该算法适用于无明确根节点及边方向由值决定的情况,通过拓扑排序并更新路径长度来寻找最长路径。
最低0.47元/天 解锁文章
54

被折叠的 条评论
为什么被折叠?



