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的時候順便更新 ...