樹形dp高階題2 JSOI2018潛入行動

2021-08-23 12:33:28 字數 1680 閱讀 5932

題目描述

外星人又雙叒叕要攻打地球了,外星母艦已經向地球航行!這一次,jyy 已經聯絡好了**艦隊,打算聯合所有 jsoier 抵禦外星人的進攻。

在**艦隊就位之前,jyy 打算事先了解外星人的進攻計畫。現在,攜帶了監聽裝置的**已經秘密潛入了外星人的母艦,準備對外星人的通訊實施監聽。

外星人的母艦可以看成是一棵 nn 個節點、 n-1n−1 條邊的無向樹,樹上的節點用 1,2,\cdots,n1,2,⋯,n 編號。jyy 的**已經裝備了**模組,可以在外星人母艦中不受限制地活動,可以神不知鬼不覺地在節點上安裝監聽裝置。

如果在節點 uu 上安裝監聽裝置,則 jyy 能夠監聽與 uu 直接相鄰所有的節點的通訊。換言之,如果在節點 uu 安裝監聽裝置,則對於樹中每一條邊 (u,v)(u,v) ,節點 vv 都會被監聽。特別注意放置在節點 uu 的監聽裝置並不監聽 uu 本身的通訊,這是 jyy 特別為了防止外星人察覺部署的戰術。

jyy 的**一共攜帶了 kk 個監聽裝置,現在 jyy 想知道,有多少種不同的放置監聽裝置的方法,能夠使得母艦上所有節點的通訊都被監聽?為了避免浪費,每個節點至多只能安裝乙個監聽裝置,且監聽裝置必須被用完。

輸入輸出格式

輸入格式:

輸入第一行包含兩個整數 n,kn,k ,表示母艦節點的數量 nn 和監聽裝置的數量 kk 。 接下來 n-1n−1 行,每行兩個整數 u,vu,v (1\le u,v\le n)(1≤u,v≤n) ,表示樹中的一條邊。

輸出格式:

輸出一行,表示滿足條件的方案數。因為答案可能很大,你只需要輸出答案 \textmod 1,000,000,007 的餘數即可。

題目傳送門

我看見有帥哥說這道題是簡單的樹形dp 。。。有點沉默

設 f[i][j][0/1][0/1] f[i][j][0/1][0/1] 表示i的子樹中已安裝j個裝置, i是/否安裝,是/否被控制的方案數, 方程過長懶得解釋,這道題難就難在要打的東西太多很容易出錯

然後要注意,很容易爆空間和時間,陣列開int,雖然dp過程中會爆int,但是陣列要開int不然會爆,然後在dp的時候強制轉long long。 這個地方我除錯了好久

#include

using

namespace

std;

//#define int long long

typedef

long

long ll;

const

int mod=1e9+7;

int n,k,f[100010][105][2][2],size[100010],front[100010];long

long g[105][2][2];

struct tedge

}e[200020];

void add(int u,int v)

int mo(int &a,ll b)

void dfs(int u,int fa)

for(int i=0;i<=min(size[u],k);++i)

for(int j=0;j<=min(size[v],k-i);++j)

size[u]+=size[v];

}}main()

dfs(1,0);

printf("%d\n",(f[1][k][1][1]+f[1][k][0][1])%mod);

return

0;}

樹形DP 高階題

emmmm我之前那篇部落格都是一些普及提高的樹形dp水題,基本都是乙個模板能夠解決的問題。現在讓我們來高階一下。傳送門 有乙個樹形結構,每條邊的長度相同,任意兩個節點可以相互到達。選3個點。兩兩距離相等。有多少種方案?難度 省選 noi 這道題的難度並不是不能接受,一開始會覺得很難但是仔細想過之後會...

樹形dp小結 2

樹形dp的題一般都結合著揹包來用。以下的幾道題都是結合著揹包的思想來的 1 樹形dp 分組揹包 狀態比較難想 之前說過在最長距離的那道題裡說過,不會返回。但是有的提示需要考慮返回的節點的。下面就是乙個例子 題目大意 給你乙個蘋果樹,有n個節點,每個節點上都有乙個乙個蘋果也就有乙個權值,當你經過這個點...

NOIP 模擬題 T2 寶藏(樹形dp)

題解 樹形dp 其實這道題說起來很簡單,用四個陣列 d1 d0 u0 u1分別表示從當前點向下更新,不返回 從當前點向下更新再回到當前點 從當前點向上更新回到當前點 從當前點向上更新不返回。用兩遍dfs求出這四個陣列 實現起來細節會比較多,耐心處理 include include include d...