链接: http://acm.hdu.edu.cn/showproblem.php?pid=2196 https://blog.csdn.net/shuangde800/article/details/9732825 #include#include #include #include #include #include #include using namespace std;typedef long long int64;const int INF = 0x3f3f3f3f;const double PI = acos(-1.0);const int MAXN = 10010;struct Node{int v, w;};vector adj[MAXN];int indeg[MAXN];int val[MAXN];int n, m;int64 f[MAXN][2];int vis[MAXN];int64 dfs1(int u) //从自己开始{ vis[u]=true; //标记自己 f[u][0] = 0; //自己到原点的距离初始化0; for(int i=0;i max1) //(第一次t)如果下一个子节点距离更长 { max2=max1; //(第一次为0)赋上次值 v2=v1; //(第一次。。) 为次节点 max1=tmp; //(第一次为目标节点到叶子加上自己到节点的权值。) v1=v; //(第一次为目标权值) } else if(tmp==max1||tmp>max2) //如果与次值相等或者比次值大 { max2=tmp;//次值等于这个值 。 v2=v;//次值节点为次节点。 } } if(u!= 1) //如果不为根节点 { int tmp = f[u][1];//除去子节点最长距离的子节点最长距离 int v = -1;//目标节点为-1; if(tmp > max1) { max2=max1; v2=v1; max1=tmp; v1=v; } else if(tmp==max1||tmp>max2) { max2=tmp; v2=v; } } for(int i=0; i