1 solutions
-
0
算法分析
从树中的某个点开始搜索,搜索到最远的点一定是某一条直径上的点,同时从搜索到的点再搜索一边,就会得到直径上的另外一个点
#include<bits/stdc++.h> using namespace std; const int N=500010,M=N*2,INF=0x3f3f3f3f; int n,m; int h[N],e[M],ne[M],w[M],idx; int fa[N],dist[N]; bool st[N]; void add(int a,int b,int c) { e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++; } int dfs(int u,int father) //找到从u开始走到的最远的点 { int res=u; //fa[u]=father; for(int i=h[u];i!=-1;i=ne[i]) { int j=e[i]; if(j==father) continue; //如果是父亲节点或者是直径上的点就不用继续了 dist[j]=dist[u]+w[i]; int k=dfs(j,u); if(dist[k]>dist[res]) { res=k; } } return res; } int main() { cin>>n; memset(h,-1,sizeof h); for(int i=0;i<n-1;i++) //获取树 { int a,b,c; cin>>a>>b>>c; add(a,b,c); add(b,a,c); } int u=dfs(1,-1); dist[u]=0; int v=dfs(u,-1); //cout<<u<<" "<<v<<endl; cout<<dist[v]; return 0; }
- 1
Information
- ID
- 2137
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 5
- Tags
- (None)
- # Submissions
- 1
- Accepted
- 1
- Uploaded By