定义:树的直径就是 树上任意两点间最短路径的最大值
有两种求法:1.两遍dfs(bfs)2.树上dp(不会还)
例题:poj1985
题意:就是一棵树 建边 然后求这个树的最大 直径是多少(模板题)
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdio>
using namespace std;
const int MAXN = 4e5+7;
int cnt,n,m,sum;
int head[MAXN];
int dis[MAXN];
struct node
{
int to,next,w;
}edge[MAXN];
void init()
{
cnt = 0;
memset(head,0,sizeof(head));
memset(dis,0,sizeof(dis));
}
void addedge(int u,int v,int w)
{
edge[++cnt].to = v;
edge[cnt].w = w;
edge[cnt].next = head[u];
head[u] = cnt;
}
void dfs(int u,int fa)// 父节点的表示 可以用递归来省空间 也可以开个父节点数组记录
{
for(int i = head[u];i != 0;i = edge[i].next)
{
int v = edge[i].to;
if(v == fa)
continue;
dis[v] = dis[u] + edge[i].w;
dfs(v,u);
}
}
int main()
{
cin>>n>>m;
init();
char c;
int s,e,len;
for(int i = 1;i <= m;i ++)
{
cin>>s>>e>>len>>c;
addedge(s,e,len);
addedge(e,s,len);//树上双向建边
}
dfs(1,0);
int pos,maxx = 0;
for(int i = 1;i <= n;i ++)
{
if(maxx < dis[i])
{
maxx = dis[i];
pos = i;
}
}
memset(dis,0,sizeof(dis));
dfs(pos,0);
int ans = 0;
for(int i = 1;i <= n;i ++)
ans = max(ans,dis[i]);
printf("%d\n",ans);
return 0;
}