求树的直径
来源:互联网 发布:逐鹿爆款词分析软件 编辑:程序博客网 时间:2024/05/16 18:43
问题:在一棵树上找出相距最远的两个节点的距离,该距离称为该树的直径。
首先任选一点,找到一个距它最远的点u,再找到距u最远的一点v,则u、v之间的距离就是树的直径。
代码:
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <vector>#include <queue>using namespace std;const int maxn = 1000007;const int INF = 0xfffff;int n,m,head[maxn],num;struct EDGE{int w,to,next;};EDGE edge[maxn];void init(){num = 0;memset(head,-1,sizeof(head));}void add(int from,int to,int w){edge[num].w = w;edge[num].to = to;edge[num].next = head[from];head[from] = num++;}int vis[maxn],dist[maxn];int bfs(int u,int &e){memset(vis,0,sizeof(vis));memset(dist,INF,sizeof(dist));vis[u] = 1;dist[u] = 0;queue<int>Q;Q.push(u);while(!Q.empty()){int x = Q.front();Q.pop();for(int i = head[x]; i != -1; i = edge[i].next){int v = edge[i].to;if(!vis[v]){dist[v] = dist[x] + edge[i].w;Q.push(v);vis[v] = 1;}}}int M = dist[1];e = 1;for(int i = 2; i <= n; i++)if(dist[i] > M){M = dist[i];e = i;}return M;}int main(){cin>>n>>m;init();while(m--){int from,to,w;cin>>from>>to>>w;add(from,to,w);add(to,from,w);}int v,u;bfs(1,v);int ans = bfs(v,u);cout<<ans<<endl;return 0;}
0 0
- 求树的直径
- 求树的直径
- 求树的直径
- 求树的直径
- BFS求树的直径
- HDU4607(求树的直径)
- [toj3517]【求树的直径】
- 求树的直径证明
- hdu4607 (求树的直径)
- 求树的直径算法
- spfa求树的直径
- 求树的直径问题
- 求树的直径(poj1383验证)
- [POJ-2631] 求树的直径
- hdu 4607 求树的直径
- 树形DP求树的直径
- hdu2196 Computer(求树的直径)
- 两次BFS求树的直径
- 自写聊天室_LinuxC实现(3)——客户端模块化优化及流程图
- git的使用
- 利用Hog 特征进行手写字符识别
- Zookeeper学习笔记
- 前端生成二维码
- 求树的直径
- Bmob在androidstudio中的环境配置和初始化
- Windows下启动多个tomcat
- 使用IDEA在引入Schema空间时报错URI is not registered解决方法
- javax.mail.AuthenticationFailedException: 550 User has no permission出错
- Hibernate的一级缓存以及二级缓存
- myjavareflection1
- oracle学习分组查询子查询
- SQL DISTINCT去掉重复的数据统计方法