這道題其實就是一道無根樹上樹的直徑的問題:
如圖,首先根據上面的做法,用兩次bfs求出樹的直徑,即ab。
那麼其實發現在實際上,問題要求max(bc只要確定了直徑的端點a、b,然後再列舉c點,求得最大值即為答案。
**:
1 #include2 #include3 #include4 #include5using
namespace
std;
6 typedef long
long
ll;7
const
int maxn=200005; 8
struct
nodeedge[maxn<<1
];11
ll d[maxn],k[maxn],head[maxn],vis[maxn];
12int
n,m,tot;
13 queueq;
14void add(int u,int v,int
w)20
int bfs(int
s)37}38
}39return
max;40}
41int
main()
50int l=bfs(1);//
a 51
int r=bfs(l);//
b52 ll ans=d[r];//
直徑長度
53for(int i=1;i<=n;i++) k[i]=d[i];//
k:ac長度
54bfs(r);
55 ll m=0;56
for(int i=1;i<=n;i++) m=max(m,min(d[i],k[i]));//
列舉c點 d:bc長度
57 printf("
%lld\n
",ans+m);
58return0;
59 }
SDOI2013 直徑(樹的直徑)
小q最近學習了一些圖論知識。根據課本,有如下定義。樹 無迴路且連通的無向圖,每條邊都有正整數的權值來表示其長度。如果一棵樹有n個節點,可以證明其有且僅有n 1 條邊。路徑 一棵樹上,任意兩個節點之間最多有一條簡單路徑。我們用 dis a,b 表示點a和點b的路徑上各邊長度之和。稱dis a,b 為a...
樹的直徑 板子
不帶解釋版模板o n 常數較大,但是可以知道樹上每一點到直徑端點的距離,這個大多時候都很有用 struct node e maxn 2 ll dis1 maxn dis2 maxn int st,ed,max len void dd int u,int fa,int len,int flag fil...
樹的直徑相關
一.樹直徑的定義.顯然一棵樹可以有不止一條直徑.二.樹直徑的求解.一般來說樹的直徑可以用樹形dp來求.設f i 0 1 f i 0 1 f i 0 1 表示在i ii的子樹中以i ii為一端的最長 次長鏈長度,我們可以很容易dp出來這個值,樹的直徑就是f i 0 f i 1 f i 0 f i 1 ...