SDOI2013 直徑(樹的直徑必經邊)

2022-04-28 19:42:11 字數 943 閱讀 2214

題目傳送

sol:

先求出任一直徑同時把直徑拎出來,樹的非直徑部分全部掛在直徑上(如下)。

對於直徑上的每乙個點i,如果存在它到非直徑上點的最大距離\(g[i]\)等於它到直徑兩端點中較短的那一段\(d[i]\),

則說明這一段也可以成為直徑中的一部分。

而我們需要得到所有直徑的交,畫圖可以發現假設兩端(以中點為界)都存在上述的點,最逼近的兩點間的邊即為所求!

具體可以看**實現。

code:

#include#define il inline

#define rg register

#define db double

#define ll long long

using namespace std;

il int gi()

while(ch>='0'&&ch<='9') x=x*10+(ch^48),ch=getchar();

return x*p;

}const int n=2e5+3;

ll mx,len,d[n],s[n],g[n];

int n,l,r,s,t,cnt,tot,ans,f[n],fa[n],vis[n],head[n];

struct edgee[n<<1];

il void make(int x,int y,int z) ,head[x]=tot;

e[++tot]=(edge),head[y]=tot;

}void dfs(int x,int fx)

void dfs2(int x,int fx,int rt)

int main()

//樹的直徑和直徑必經邊

SDOI2013 直徑(樹的直徑)

小q最近學習了一些圖論知識。根據課本,有如下定義。樹 無迴路且連通的無向圖,每條邊都有正整數的權值來表示其長度。如果一棵樹有n個節點,可以證明其有且僅有n 1 條邊。路徑 一棵樹上,任意兩個節點之間最多有一條簡單路徑。我們用 dis a,b 表示點a和點b的路徑上各邊長度之和。稱dis a,b 為a...

樹的直徑 P2491 SDOI2011 消防

首先不難證明,最優解一定出現在直徑上,我們可以先跑兩次dfs求出來直徑 然後將直徑上的點的距離算一下,之後再算非直徑點的最大距離,求最大值即可 includeusing namespace std const int maxn 3e5 5 int n,s,tot,st,ed,max dis int ...

樹的直徑 板子

不帶解釋版模板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...