題目: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...