hdu 4607 求樹的直徑

2021-06-17 00:18:00 字數 829 閱讀 2606

分析後就是求樹的直徑兩次bfs即可

證明:樹的直徑是指樹的最長簡單路。求法: 兩遍bfs :先任選乙個起點bfs找到最長路的終點,再從終點進行bfs,則第二次bfs找到的最長路即為樹的直徑;

原理: 設起點為u,第一次bfs找到的終點v一定是樹的直徑的乙個端點

證明: 1) 如果u 是直徑上的點,則v顯然是直徑的終點(因為如果v不是的話,則必定存在另乙個點w使得u到w的距離更長,則於bfs找到了v矛盾)

2) 如果u不是直徑上的點,則u到v必然於樹的直徑相交(反證),那麼交點到v 必然就是直徑的後半段了

所以v一定是直徑的乙個端點,所以從v進行bfs得到的一定是直徑長度

**:#include #include #include #include using namespace std;

struct node

;node edge[300005];

int first[100005],next[300005];

int d[100005];

int cc;

inline void add_edge(int u,int v)

int bfs(int u)

q.push(v);}}

}return res;

}int main()

{ int t;

scanf("%d",&t);

while(t--)

{int n,m;

scanf("%d%d",&n,&m);

int i;

memset(first,-1,sizeof(first));

cc=0;

for(i=0;i

HDU4607 樹的直徑

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

樹的直徑 hdu 4607

樹的直徑定義 樹中所有最短路徑的最大值。定義distance a,b 為頂點a與b之間的最短距離。用數學語言表示就是 對於一棵樹 t v,e 彐vx,vy v,v1,v2 v,都有distance v1,v2 distance vx,vy 則把vx到vy的最短路徑稱為樹t的直徑。現在我們來用演算法求...

hdu4607雙dfs求樹的直徑 公式

如下 include include include include using namespace std 這是我寫的求樹的直徑的最後一種方法,寫完我就去玩 樹形dp了。祝福我吧。省賽也即將來臨,東北賽也如期而至,希望自己可以打得更好。以最短的時間複習功課,爭取不掛科就行。以效率來搶時間。加油df...