求树的直径

来源:互联网 发布:逐鹿爆款词分析软件 编辑:程序博客网 时间: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
原创粉丝点击