P2515 HAOI2010 軟體安裝

2022-04-10 04:19:08 字數 2020 閱讀 1997

link

現在我們的手頭有 \(n\) 個軟體,對於乙個軟體 \(i\) ,它要占用 \(w_i\)的磁碟空間,它的價值 \(v_i\)。我們希望從中選擇一些軟體安裝到一台磁碟容量為 \(m\) 計算機上,使得這些軟體的價值盡可能大(即 \(v_i\)的和最大)。

但是現在有個問題:軟體之間存在依賴關係,即軟體i只有在安裝了軟體 \(j\)(包括軟體 \(j\) 的直接或間接依賴)的情況下才能正確工作(軟體 \(i\) 依賴軟體 \(j\) )。幸運的是,乙個軟體最多依賴另外乙個軟體。如果乙個軟體不能正常工作,那麼它能夠發揮的作用為 \(0\) 。

我們現在知道了軟體之間的依賴關係:軟體 \(i\) 依賴軟體 \(d_i\)。現在請你設計出一種方案,安裝價值盡量大的軟體。乙個軟體只能被安裝一次,如果乙個軟體沒有依賴則 \(d_i=0\),這時只要這個軟體安裝了,它就能正常工作。

第1行:\(n,m(0\leq n\leq 100, 0\leq m\leq 500)\)

第2行:\(w_1,w_2, ... w_i, ..., w_n (0\leq w_i\leq m)\)

第3行:\(v_1, v_2, ..., v_i, ..., v_n (0\leq v_i\leq 1000)\)

第4行 \(d_1, d_2, ..., d_i, ..., d_n (0\leq d_i\leq n, d_i≠i)\)

乙個整數,代表最大價值

輸入 #1

3 10

5 5 6

2 3 4

0 1 1

輸出 #1

5
乙個比較顯然的問題就是如果我們按照依賴關係建邊的話,會得到一棵樹(對沒有依賴的點建個超級源)。

剩下的就是樹形揹包的裸題啦。

但,當你興奮的交上去,認為又能水一道題的時候,卻發現你 \(wa\) 了。

因為 依賴關係可能會成為乙個環,這就需要我們的第二個知識點, \(tarjian\)

\(tarjian\) 縮完點之後,我們就可以得到乙個有向無環圖,在向沒有依賴的點建個超級源,這就變成了我們熟悉的樹上揹包問題。

乙個需要注意的點就是,一定要在縮完點之後,在和超級源連邊,否則可能會把超級源也給算進去。

還有就是 \(f\) 陣列一定要賦初值,我就在這裡卡了好幾回。

code

#include#include#includeusing namespace std;

const int n = 1010;

int n,m,x,cnt,sum,tot,top,num;

int head[n],hed[n],a[n],b[n],w[n],c[n];

int low[n],dfn[n],sta[n],shu[n],du[n],f[110][510];

bool vis[n];

inline int read()

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

return s * w;

}struct node

e[n<<1],e2[n<<1];

void add(int x,int y)

void add(int x,int y)

void tarjain(int x)

else if(vis[to])

}if(dfn[x] == low[x])

while(x != y); }}

void rebuild()

} }for(int i = 1; i <= cnt; i++) }

void dp(int x,int fa)

} }}int main()

for(int i = 1; i <= n; i++)//縮點

rebuild();//重新建圖

dp(0,0);//樹上揹包

printf("%d\n",f[0][m]);

return 0;

}

P2515 HAOI2010 軟體安裝

傻了。思路 scc 縮點,樹上揹包。提交 2次 無語。建邊建錯了 思路 關係可能會形成環,而整個環是乙個整體 要選就選環上所有點,否則整個不選 所以我們先把所有的環縮點,然後便形成了一棵樹 乙個點不可能有兩個父親 然後跑樹上揹包。include include using namespace std...

P2515 HAOI2010 軟體安裝

現在我們的手頭有n個軟體,對於乙個軟體i,它要占用wi的磁碟空間,它的價值為vi。我們希望從中選擇一些軟體安裝到一台磁碟容量為m計算機上,使得這些軟體的價值盡可能大 即vi的和最大 但是現在有個問題 軟體之間存在依賴關係,即軟體i只有在安裝了軟體j 包括軟體j的直接或間接依賴 的情況下才能正確工作 ...

P2515 HAOI2010 軟體安裝

給你 n 個可能有依賴關係的物品,物品的價值為 v i 重量為 w i 揹包大小為 m 要使裝的物品價值最大。如果確保這些依賴關係一定是棵樹的話,那麼我們就可以愉快地進行樹形dp。這裡複習一下樹形dp 這裡設 dp u j 表示以 u 為根的子樹中裝了重量為 j 的最大價值。在dfs的時候順便更新 ...