樹型動態規劃 巡邏

2021-06-05 06:14:44 字數 2649 閱讀 5411

【問題描述】 

在乙個地區中有 n個村莊,編號為1, 2, ..., n。有n – 1條道路連線著這些村

莊,每條道路剛好連線兩個村莊,從任何乙個村莊,都可以通過這些道路到達其

他任乙個村莊。每條道路的長度均為 1個單位。

為保證該地區的安全,巡警車每天要到所有的道路上巡邏。警察局設在編號

為1的村莊裡,每天巡警車總是從警察局出發,最終又回到警察局。

下圖表示乙個有8個村莊的地區,其中村莊用圓表示(其中村莊 1用黑色的

圓表示),道路是連線這些圓的線段。為了遍歷所有的道路,巡警車需要走的距

離為14 個單位,每條道路都需要經過兩次。

為了減少總的巡邏距離,該地區準備在這些村莊之間建立 k 條新的道路,

每條新道路可以連線任意兩個村莊。兩條新道路可以在同乙個村莊會合或結束

(見下面的圖例(c) )。一條新道路甚至可以是乙個環,即,其兩端連線到同一

個村莊。

由於資金有限,k 只能是 1或2。同時,為了不浪費資金,每天巡警車必須

經過新建的道路正好一次。

下圖給出了一些建立新道路的例子:

在(a)中,新建了一條道路,總的距離是 11。在(b)中,新建了兩條道路,總

的巡邏距離是 10。在(c)中,新建了兩條道路,但由於巡警車要經過每條新道路

正好一次,總的距離變為了 15。

試編寫乙個程式,讀取村莊間道路的資訊和需要新建的道路數,計算出最佳

的新建道路的方案使得總的巡邏距離最小,並輸出這個最小的巡邏距離。

【輸入格式】

第一行包含兩個整數 n, k(1 ≤ k ≤ 2)。接下來 n – 1行,每行兩個整數 a, b,

表示村莊a與b之間有一條道路(1 ≤ a, b ≤ n)。

【輸出格式】

輸出乙個整數,表示新建了k 條道路後能達到的最小巡邏距離。

【樣例輸入1】

8 1

1 2

3 1

3 4

5 3

7 5

8 5

5 6

【樣例輸出 1】

11 【樣例輸入2】

8 2

1 2

3 1

3 4

5 3

7 5

8 5

5 6

【樣例輸出 2】

10 【樣例輸入3】

5 2

1 2

2 3

3 4

4 5

【樣例輸出 3】

6 【資料範圍】

10%的資料中,n ≤ 1000, k = 1;

30%的資料中,k = 1;

80%的資料中,每個村莊相鄰的村莊數不超過 25;

90%的資料中,每個村莊相鄰的村莊數不超過 150;

100%的資料中,3 ≤ n ≤ 100,000, 1 ≤ k ≤ 2。

此題可以用樹形動態規劃解決。

狀態:f[u][j][k]表示u這棵子樹中,共有j條完整的鏈加上k / 2條伸出到其它樹根的鏈(這樣的鏈算半條)。

轉移過程見程式注釋。

accode:

#include #include #include using std::max;

const char fi = "patrol.in";

const char fo = "patrol.out";

const int maxn = 100010;

struct edge *edge[maxn];

int f[maxn][3][2], tmp[3][2], n, k;

void init_file()

inline int getint()

inline void insert(int u, int v)

void readdata()

return;

}void dp(int u, int last)

}return;

}void work()

int main()

第二次做:

#include #include #include #include #define max(a, b) ((a) > (b) ? (a) : (b))

const int maxn = 100010;

struct edge *edge[maxn];

int f[maxn][3][2], pf[3][2], n, k;

void dp(int u, int last)

}return;

}inline int getint()

inline void ins(int u, int v)

int main()

dp(1, 0);

int ans = max(f[1][1][0], f[1][k][0]);

printf("%d\n", (n << 1) + k - 2 - ans); //

return 0;

}

樹型動態規劃練習總結

型別 一 多叉樹轉二叉樹進行資源分配 例如 例1.選課 每門課可能有一門先選課,即某些課必須在另外的某節課被選之後才能選,每門課能得的學分不同,求最大學分。例2.通向自由的鑰匙 可以從乙個房間通向另外多個房間,通過每個房間所需的花費不同,得到的價值也不同,用最小花費獲得最大價值。這種題目的特點是需要...

區間型動態規劃

給定乙個序列 字串,進行一些操作 最後一步將序列 字串去頭 去尾 剩下的會是乙個區間 i,j 狀態自然定義為f i j 表示面對子串行 i j 時的最優性質 667.最長的回文序列 中文english 給一字串 s,找出在 s 中的最長回文子串行的長度.你可以假設 s 的最大長度為 1000.exa...

二 蘋果樹 樹型動態規劃

題目大意 對於乙個二叉樹,除根節點外,每個節點都有相應的乙個權值。在此基礎上,求保留多少個點使得其仍然滿足樹的性質且權值總和最大。分析 先建樹。ch v,1 ch v,2 分別存v節點的左右孩子。dp v,l 存以v為根的樹保留l個節點的最大權和。num v 為點v的權值。dp v,l max 0 ...