生活随笔
收集整理的這篇文章主要介紹了
CF120F Spiders 题解
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目:CF120F Spiders
DP - 樹(shù)形DP - 樹(shù)的直徑 - 圖論 - 樹(shù) - bfs
題目大意
給出 nnn 棵樹(shù),你每次可以選擇兩個(gè)樹(shù),并將這兩棵樹(shù)的兩個(gè)節(jié)點(diǎn)粘起來(lái),形成一棵新的樹(shù)。經(jīng)過(guò) n?1n-1n?1 次操作后,這 nnn 棵樹(shù)就融合為了一棵樹(shù)
問(wèn)最后這棵樹(shù)的最大直徑(最長(zhǎng)鏈)長(zhǎng)度
解題思路
以前看到有些題是要求直徑最短,看到這題之后松了口氣
因?yàn)樽詈笠蟮氖?strong>最長(zhǎng)鏈,所以,每一棵樹(shù)都要把自己的最長(zhǎng)鏈(直徑)貢獻(xiàn)給最終答案
那么我們就把 nnn 棵樹(shù)的直徑粘成一段不就好了嗎
換句話說(shuō):設(shè)第 iii 棵樹(shù)的直徑端點(diǎn)為 ui,viu_i,v_iui?,vi?,[x,y][x,y][x,y] 表示一個(gè)將點(diǎn) xxx 和點(diǎn) yyy 粘起來(lái)的操作。
那么就:[v1,u2],[v2,u3]…[vn?1,un][v_1,u_2],[v_2,u_3] \dots [v_{n-1},u_n][v1?,u2?],[v2?,u3?]…[vn?1?,un?]
最后的答案就是 nnn 棵樹(shù)的直徑之和了
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std
;
const int Maxn
=1010,inf
=0x3f3f3f3f;
int dis
[Maxn
],f
[Maxn
];
int n
,ans
;
vector
<int> e
[Maxn
];
inline int read()
{int s
=0,w
=1;char ch
=getchar();while(ch
<'0'||ch
>'9'){if(ch
=='-')w
=-1;ch
=getchar();}while(ch
>='0' && ch
<='9')s
=(s
<<3)+(s
<<1)+(ch
^48),ch
=getchar();return s
*w
;
}
void dfs(int x
,int fa
)
{int m1
=0,m2
=0;for(int i
=0;i
<e
[x
].size();++i
){int y
=e
[x
][i
];if(y
==fa
)continue;dfs(y
,x
);f
[x
]=max(f
[x
],f
[y
]+1);int tmp
=f
[y
]+1;if(tmp
>m1
)m2
=m1
,m1
=tmp
;else if(tmp
>m2
)m2
=tmp
;}dis
[x
]=max(m1
+m2
,max(m1
,m2
));
}
int main()
{freopen("input.txt","r",stdin); freopen("output.txt","w",stdout);int T
=read();while(T
--){n
=read();int tot
=0;for(int i
=1;i
<n
;++i
){int x
=read(),y
=read();e
[x
].push_back(y
);e
[y
].push_back(x
);}dfs(1,0);for(int i
=1;i
<=n
;++i
)tot
=max(tot
,dis
[i
]);ans
+=tot
;for(int i
=1;i
<=n
;++i
){e
[i
].clear();dis
[i
]=f
[i
]=0;}}printf("%d\n",ans
);return 0;
}
總結(jié)
以上是生活随笔為你收集整理的CF120F Spiders 题解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。