解题思路:设dp[i]为以i为根节点该树的深度。随便选一个作为根节点,求与其直接相连的子树最长长度dp[j],长度最长的前两个再加上两株子树分别与根节点的距离则可以求得树中最远的两点距离。
题目大意:给定一棵n个结点的无根树,找到一条最长路径。换句话说,要找到两个点,使得它们的距离最短。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
struct Edge{
int next,dis;
};
int n,dp[101];
vector<Edge> edge[101];
int dfs(int m,int fa)
{
for(int i=0;i<edge[m].size();i++)
{
int t=edge[m][i].next;int d=edge[m][i].dis;
if(t!=fa)
{
dp[m]=max(dp[m],dfs(t,m)+d);
}
}
return dp[m];
}
int cmp(int a,int b)
{
return a>b;
}
int main()
{
while(cin>>n)
{
for(int i=1;i<=n;i++)
{
int a,b,c;
cin>>a>>b>>c;
Edge tmp;
tmp.next=b;tmp.dis=c;
edge[a].push_back(tmp);
tmp.next=a;
edge[b].push_back(tmp);
}
memset(dp,0,sizeof(dp));
dfs(1,-1);
for(int i=0;i<edge[1].size();i++) //与根节点直接相连的再加上与根节点的距离得到各子树距离
{
int t=edge[1][i].next;int c=edge[1][i].dis;
dp[t]+=c;
}
sort(dp+2,dp+n+2,cmp); //这边还有点问题,应该是排序与根节点直接相连的子树深度
cout<<dp[2]+dp[3]<<endl;
}
return 0;
}
417

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



