樹的最大連通分支問題

2021-10-04 19:05:36 字數 828 閱讀 9427

問題描述:

給定一棵樹 t,樹中每個頂點 u 都有乙個權 w(u),權可以是負數。現在要找到樹 t 的乙個連通子圖使該子圖的權之和最大。

對於給定的樹 t,程式設計計算樹 t 的最大連通分支。

資料輸入:

第 1 行有 1 個正整數 n,表示樹 t 有 n 個頂點。樹 t 的頂點編號為 1,…,n。第 2 行有 n 個整數,表示 n 個頂點的權值。接下來的 n-1 行中,每 行有表示樹 t 的一條邊的 2 個整數 u,v,表示頂點 u 與頂點 v 相連。

由於這裡的樹結構具有嚴格的遞迴定義,所以們用樹形動態規劃來解決此題,假設sum(k)是以k為根節點的樹的最大連通子圖的權值,那麼有遞推關係:

#include

#include

using namespace std;

const

int maxn=

1005

;vector<

int>g[maxn]

;//圖

int w[maxn]

;//邊權

bool visit[maxn]=;

//標記訪問

int res=0;

//記錄最大聯通子圖權值

inttree

(int u)

} res=

max(res,sum)

;//迭代選擇最大值

return sum;

}int

main()

cout<<

tree(0

)

}

訪問每個子節點一次,時間複雜度為o(n)

強連通分支

1。定義 有向圖強連通分量 在有向圖g中,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通 strongly connected 如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。非強連通圖有向圖的極大強連通子圖,稱為強連通分量 strongly connected components 現在來...

邊雙連通分支

求邊雙連通分支 跑一遍求割點與橋的tarjan得到該圖的割點和橋,去掉橋,其餘連通分支就是邊連通分支了,邊連通分支數是橋數 1。邊連通分支就是去掉最少兩條邊才能將該圖劃分為兩個部分的圖,橋就是乙個圖被去掉一條邊就能變成兩個子圖的那一條邊,構造邊雙連通分支 把雙連通子圖收縮為乙個點,形成乙個樹,需要加...

tarjan演算法求強連通分支

近期做資料結構課程設計,遇到了有向圖的強連通分支的問題,網上採用的是基於深度優先遍歷的tarjan演算法,在考了許多部落格後,還是有些迷,在思考了一番後,終於明白了,所以寫了這篇文章。首先,明確以下幾點。tarjan演算法基於深度優先遍歷。使用時,會用到兩個棧。乙個棧用於dfs,如果是遞迴的tarj...