【問題描述】
在乙個地區中有 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 ...