题目链接
求树的直径(树中最长的距离)
- 任意取一个点x,求其到其他所有点的距离,最远距离的为y
- 再求y到其他所有点的距离,此时最远距离就是答案
可以用反证法假设y点不是直径的端点证明上述结论,因为点到点之间的路径是一定的,所以可以用dfs或者bfs求距离,如果是图的话就用Dijkstra或者Floyd算法求
补充:边数=n-1就是树(无环图),边数<n-1连通块 边数>n-1有环图
AC Code
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int N = 1e5+5;
int n,p,q,d;
int dis[N],vis[N];
struct edge
{
int id,w;
};
vector<edge> v[N];
void dfs(int x)
{
vis[x]=1;
for(auto it:v[x])
if(!vis[it.id])
{
dis[it.id] = dis[x]+it.w;
dfs(it.id);
}
}
int main()
{
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>p>>q>>d;
v[p].push_back((edge){q,d});
v[q].push_back((edge){p,d});
}
dis[1]=0;
dfs(1);
int pos=1;
for(int i=1; i<=n; i++)
if(dis[i]>dis[pos])
pos = i;
dis[pos]=0;
memset(vis,0,sizeof vis);
dfs(pos);
for(int i=1; i<=n; i++)
if(dis[i]>dis[pos])
pos=i;
long long ans = dis[pos]*10 + (1ll+dis[pos])*dis[pos]/2;
cout<<ans;
return 0;
}