問題描述:
給定一棵樹 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...