現在我們的手頭有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 )
輸出格式:
乙個整數,代表最大價值
輸入樣例#1:
3 105 5 6
2 3 4
0 1 1
輸出樣例#1:
5f[u][i]表示安裝u占用i的記憶體能得到的最大價值
1 #include 2 #include 34using
namespace
std;56
const
int n(119);7
const
int m(555);8
intn,m,w[n],v[n],f[n][m];910
inthed[n],had[n],sumedge;
11struct
edge
1216 }edge[m<<1
];17
void ins(int u,int v,int *head)
1822
23int
tim,dfn[n],low[n];
24int
stack[n],instack[n],top;
25int
sumcol,col[n],cval[n],cw[n];
26void dfs(int
now)
2736
if(low[now]==dfn[now])
3748 instack[now]=0;top--;49}
50}5152
intdad[n],root;
53void
get_tree()
5462}63
void dp(int
x)64
72for(int i=m;i>=0;i--)
7377}78
79int
main()
8091
for(int i=1;i<=n;i++)
92if(!dfn[i]) dfs(i);
93get_tree();
94for(int i=1;i<=sumcol;i++)
95if(!dad[i])
96100 dp(sumcol+1
);101 printf("
%d",f[sumcol+1
][m]);
102return0;
103 }
洛谷P2515 HAOI2010 軟體安裝
現在我們的手頭有n個軟體,對於乙個軟體i,它要占用wi的磁碟空間,它的價值為vi。我們希望從中選擇一些軟體安裝到一台磁碟容量為m計算機上,使得這些軟體的價值盡可能大 即vi的和最大 但是現在有個問題 軟體之間存在依賴關係,即軟體i只有在安裝了軟體j 包括軟體j的直接或間接依賴 的情況下才能正確工作 ...
P2515 HAOI2010 軟體安裝
傻了。思路 scc 縮點,樹上揹包。提交 2次 無語。建邊建錯了 思路 關係可能會形成環,而整個環是乙個整體 要選就選環上所有點,否則整個不選 所以我們先把所有的環縮點,然後便形成了一棵樹 乙個點不可能有兩個父親 然後跑樹上揹包。include include using namespace std...
P2515 HAOI2010 軟體安裝
現在我們的手頭有n個軟體,對於乙個軟體i,它要占用wi的磁碟空間,它的價值為vi。我們希望從中選擇一些軟體安裝到一台磁碟容量為m計算機上,使得這些軟體的價值盡可能大 即vi的和最大 但是現在有個問題 軟體之間存在依賴關係,即軟體i只有在安裝了軟體j 包括軟體j的直接或間接依賴 的情況下才能正確工作 ...