小a與尤拉迴路(樹的直徑的求法)

2021-09-22 02:01:16 字數 1233 閱讀 3857

題目鏈結

這道題是一點思路都沒有,看了別人的題解後,知道了答案其實是

ans = 樹的總權值 * 2 - 樹的直徑;

首先,易知每個邊最多複製兩遍。思考後,可知,我們先假定每個邊都複製了兩遍,於是得到

樹的總權值 * 2;

顯然,我們算多了。於是我們考慮減去某些邊,這裡我們可以將樹看作乙個帶有支路的一條主幹道

這時我們從主幹道的一端出發,到達另一端。那麼此時主幹道上的邊可以只複製一次,而支路上的邊要複製兩次。所以,我們只要讓這條「主幹道」最長就好了,即為樹的直徑。於是就有上文的結論。

這裡使用兩次bfs求直徑。

第一次:以任意點為起點,bfs出離當前點最遠的一點point

第二次:以point為起點, bfs出離point最遠的點的距離,該距離即為所求

下面是ac**:

#include

#include

#include

#define ll long long

using

namespace std;

const

int max =

2000005

;int ver[

2*max]

=, he[

2*max]

=, ne[

2*max]=;

int e[max]=;

bool vis[max]=;

ll dis[max]=;

int tot =0;

int n;

void

init()

void

add(

int x,

int y,

int w)

ll len =

0, point;

void

bfs(

int st)

q.push

(ver[i]);

}}}return;}

intmain()

len =0;

bfs(1)

; len =0;

bfs(point)

;printf

("%lld\n"

, ans - len)

;return0;

}

尤拉迴路 輸出尤拉迴路的路徑

有向or無向均可,重邊 step1 從u開始,找到與他相連的v,放入棧,刪除 u,v 這條邊,然後從v開始 step2 當有一點沒有與他相連的點時,放入path,然後從stack取棧頂繼續開始找點刪邊。最後記得把棧裡的點放到path中。path倒序輸出 需要先找到起點 鄰接表法,適合稀疏圖 incl...

尤拉迴路的判斷

華電北風吹 天津大學認知計算與應用重點實驗室 2016 06 29 尤拉迴路 圖g,若存在一條路,經過g中每條邊有且僅有一次,稱這條路為尤拉路,如果存在一條迴路經過g每條邊有且僅有一次,稱這條迴路為尤拉迴路。具有尤拉迴路的圖成為尤拉圖。判斷尤拉路是否存在的方法 有向圖 圖連通,有乙個頂點出度大入度1...

尤拉迴路的判定和求解

2 有向圖 尤拉迴路的求解 無向圖 連通 不考慮度為 0 的點 每個頂點度數都為偶數。ac include include include include include include include include include using namespace std const int ma...