2 条题解
-
-2
做法1:(1)两次dfs(不适用于负边权)
首先从任意节点c开始进行第一次 DFS,到达距离其最远的节点,记为z1,然后再从z1 开始做第二次 DFS,到达距离z1最远的节点,记为z2,则(z1,z2)即为树的直径。(具体证明可参考OI WIKI)
#include<bits/stdc++.h> using namespace std; int n,de[105],c,u,v; vector<int> e[105]; void dfs(int u,int fa) { for(int i=0;i<e[u].size();i++) { int v=e[u][i]; if(v==fa) continue; de[v]=de[u]+1; if(de[v]>de[c]) { c=v; } dfs(v,u); } } int main() { ios::sync_with_stdio(false); cin.tie(0); cin>>n; for(int i=1;i<n;i++) { cin>>u>>v; e[u].push_back(v); e[v].push_back(u); } dfs(1,0); de[c]=0; dfs(c,0); cout<<de[c]; return 0; }
- 1
信息
- ID
- 1168
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 1
- 标签
- 递交数
- 49
- 已通过
- 34
- 上传者