BZOJ2427 HAOI2010 軟體安裝

2022-03-29 17:11:30 字數 2189 閱讀 2253

bzoj2427: [haoi2010]軟體安裝

現在我們的手頭有n個軟體,對於乙個軟體i,它要占用wi的磁碟空間,它的價值為vi。

我們希望從中選擇一些軟體安裝到一台磁碟容量為m計算機上,使得這些軟體的價值盡可能大(即vi的和最大)。

但是現在有個問題:軟體之間存在依賴關係,即軟體i只有在安裝了軟體j(包括軟體j的直接或間接依賴)的情況下才能正確工作(軟體i依賴軟體j)。

幸運的是,乙個軟體最多依賴另外乙個軟體。如果乙個軟體不能正常工作,那麼它能夠發揮的作用為0。

我們現在知道了軟體之間的依賴關係:軟體i依賴軟體di。現在請你設計出一種方案,安裝價值盡量大的軟體。

乙個軟體只能被安裝一次,如果乙個軟體沒有依賴則di=0,這時只要這個軟體安裝了,它就能正常工作。

第1行:n, m  (0<=n<=100, 0<=m<=500)

第2行:w1, w2, ... wi, ..., wn (0<=wi

<=m )

第3行:v1, v2, ..., vi, ..., vn  (0<=vi<=1000 )

第4行:d1, d2, ..., di, ..., dn

(0<=di

<=n, di≠i )

乙個整數,代表最大價值。

3 10

5 5 6

2 3 4

0 1 1

5最近沉迷$dp$無法自拔。。。

這是乙個有依賴的揹包問題。

強行$tarjan$縮點然後轉換成樹形$dp$。

縮點應該不用多說。

然後來看樹上怎麼做。

設$dp[i][j]$表示當前在$i$這個點,用了$j$個單位的磁碟空間,所能獲得的最大價值。

轉移方程就很好寫啦:

設$weight[i]$表示$i$這個點的磁碟空間,$value[i]$表示$i$這個點的價值。

首先對於$dfs$到的所有的$u$,我們初始化:

$$dp[u][i]=value[u],i\in[weight[u],m]$$

對於$\forall v\in son_u$,我們這樣轉移:

$$dp[u][i+weight[u]]=\max\$$

其中,$i$為倒序列舉,$j$為正序列舉。

這就是樹形揹包全過程。

但是!縮完點之後有可能不止一棵樹啊!

不要緊,我們建立乙個超級樹根$root$,連到每棵樹的樹根即可。

最終答案就是$dp[root][m]$。

然而一開始把縮點敲炸了,尷尬。。。

附**:

#include#include#include#define maxn 110

using namespace std;

int n,m,root;

int weight[maxn],value[maxn],colour[maxn];

inline int read()

while(c>='0'&&c<='9')

return date*w;

}namespace tarjana[maxn];

inline void add_edge(int x,int y)

void dfs(int x)

else if(vis[v])low[x]=min(low[x],deep[v]);

}if(low[x]==deep[x])while(cstack[--top]!=x);}}

void solve()

for(int i=1;i<=n;i++)if(!deep[i])dfs(i);

for(int i=1;i<=n;i++)

}}namespace dpa[maxn<<2];

inline void add_edge(int x,int y)

void dfs(int rt)}}

} }void solve()

} for(int i=1;i<=tarjan::s;i++)if(!indegree[i])add_edge(root,i);

deep[root]=1;

dfs(root); }}

void work()

void init()

int main()

BZOJ 2427 HAOI2010 軟體安裝

time limit 10 sec memory limit 128 mb submit 2146 solved 865 submit status discuss description 現在我們的手頭有n個軟體,對於乙個軟體i,它要占用wi的磁碟空間,它的價值為vi。我們希望從中選擇一些軟體安裝...

BZOJ 2427 HAOI2010 軟體安裝

bzoj 2427 haoi2010 軟體安裝 tarjan 樹形dp 題意 現在我們的手頭有n個軟體,對於乙個軟體i,它要占用wi的磁碟空間,它的價值為vi。我們希望從中選擇一些軟體安裝到一台磁碟容量為m計算機上,使得這些軟體的價值盡可能大 即vi的和最大 但是現在有個問題 軟體之間存在依賴關係,...

bzoj2427 軟體安裝

軟體安裝 題目背景 bzoj2427 分析 樹型dp 原圖有環 並且好像有和其他部分不連通的單個環 這個題,顯然應該是一些環和一些樹放到一起,那麼顯然的對於乙個環要麼全部選擇,要麼乙個都不選,那麼我們先 tarjan 縮點一發每乙個 scc的 w為原來所有 w的和,v為原來所有的 v和,然後就成了一...