題目鏈結
這道題是一點思路都沒有,看了別人的題解後,知道了答案其實是
ans = 樹的總權值 * 2 - 樹的直徑;首先,易知每個邊最多複製兩遍。思考後,可知,我們先假定每個邊都複製了兩遍,於是得到
樹的總權值 * 2;顯然,我們算多了。於是我們考慮減去某些邊,這裡我們可以將樹看作乙個帶有支路的一條主幹道
這時我們從主幹道的一端出發,到達另一端。那麼此時主幹道上的邊可以只複製一次,而支路上的邊要複製兩次。所以,我們只要讓這條「主幹道」最長就好了,即為樹的直徑。於是就有上文的結論。
這裡使用兩次bfs求直徑。
第一次:以任意點為起點,bfs出離當前點最遠的一點point下面是ac**:第二次:以point為起點, bfs出離point最遠的點的距離,該距離即為所求
#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...