HDU4607 求樹中的最長鏈

2021-06-16 23:35:53 字數 938 閱讀 8083

題目:park visit

題意:給定一棵樹,從樹中的任意選乙個頂點出發,遍歷k個點的最短距離是多少?(每條邊的長度為1)

解析:就是求樹的最長鏈,假設求出的樹的最長鏈所包含的點數為m,那麼如果k<=m,那麼答案就是k-1,否則就是(k-m)

*2+m-1

找樹中最長鏈方法是:

可以通過經典的o(n)的演算法求出樹的直徑。做法是從任意一點開始dfs或者bfs一次求出乙個最遠的點,這是直徑的乙個端點;

再從這個最遠點開始再次dfs或者bfs,再找到的最遠點就是直徑的另外乙個端點。

#include #include #include using namespace std;

const int n=200010;

int head[n],to[n],next[n],w[n];

int dis[n],que[n];

bool vis[n];

int edge,m,n;

void init()

void add(int u,int v,int c)

void bfs(int s)}}

}int treediameter(int s)

int main()

int ans=treediameter(1);

ans++;

while(m--)

}return 0;

}

HDU4607 求樹中的最長鏈

題目 park visit 題意 給定一棵樹,從樹中的任意選乙個頂點出發,遍歷k個點的最短距離是多少?每條邊的長度為1 解析 就是求樹的最長鏈,假設求出的樹的最長鏈所包含的點數為m,那麼如果k m,那麼答案就是k 1,否則就是 k m 2 m 1 include include include us...

hdu 4607 求樹的直徑

分析後就是求樹的直徑兩次bfs即可 證明 樹的直徑是指樹的最長簡單路。求法 兩遍bfs 先任選乙個起點bfs找到最長路的終點,再從終點進行bfs,則第二次bfs找到的最長路即為樹的直徑 原理 設起點為u,第一次bfs找到的終點v一定是樹的直徑的乙個端點 證明 1 如果u 是直徑上的點,則v顯然是直徑...

HDU4607 樹的直徑

樹的直徑的求法,任取一點u為起點,bfs出一條最長路徑,假設此時終點為v,則再次以v為起點,再bfs出一條最長路徑v w。可以得出樹的直徑即為所求。證明略。可以直接bfs或者dfs都行,來發水題 author crazy 石頭 data structure 樹的直徑 created time 201...