分析後就是求樹的直徑兩次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...