題目描述
外星人又雙叒叕要攻打地球了,外星母艦已經向地球航行!這一次,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...