思路:不同型別的點對他進行建邊,等於是將原來的一棵樹斷開了一些邊,成了一片森林,那麼對每棵樹求一下直徑,維護max即可。可以用並查集維護每棵樹內的結點。
#include
using namespace std;
typedef
long
long ll;
const ll mod=
1e9+7;
const
int n=
1e6+50;
int f[n]
;int
find
(int x)
int r,ans;
char c[n]
;bool vis[n]
;int dis[n]
;vector<
int> e[n]
;vector<
int> q[n]
;void
bfs(
int root)}}
}int sum;
void
solve
(int s)
bfs(s)
; ans=0;
for(
auto z:q[s]
)bfs
(r);
sum=
max(sum,ans);}
intmain()
}for
(int i=
1;i<=n;i++
) q[
find
(i)]
.push_back
(i);
for(
int i=
1;i<=n;i++)}
cout
}
線段樹的實現鴨
線段樹的實現 includeusing namespace std define ll long long define db double define max 10000 define rep i,j,k for int i int j i int k i define per i,j,k fo...
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...