树的直径
定义:
对于一棵树,找到树上的两个节点并且他们的路径最长,该最长路径即为该树的直径
求法:
1、使用bfs或dfs:先取树中的一个点进行dfs/bfs,找到离该点最远的点p,点p一定是树直径的一个端点
以该点在进行一次dfs/bfs,找到一个离p点最远的点q,则pq为该树的直径,且pq的距离为直径大小
2、树形dp(待补全)
代码:
dfs
void dfs(int u,int fa,int dist) //u为当前结点,fa为u的父亲节点, dist为遍历到该点的距离 { if(ans<dist) { ans=dist; pos=u; } for(int i=head[u];i!=-1;i=edge[i].next) { int to=edge[i].to; if(to==fa)continue; dfs(to,u,dist+edge[i].val); } }
bfs
void bfs(int u) { memset(vis1,false,sizeof(vis1)); memset(dis,0,sizeof(dis));ans=0; queue<int>que; while(!que.empty())que.pop(); que.push(u); vis[u]=true; while(!que.empty()) { int top=que.front(); que.pop(); for(int i=head[top];i!=-1;i=edge[i].next) { int to=edge[i].to; if(!vis[to]) { vis[to]=true; dis[to]=dis[top]+edge[i].val; que.push(to); if(ans<dis[to]) { ans=dis[to]; pos=to; } } } } }