洛谷 P2515 HAOI2010 軟體安裝

2022-04-10 14:21:48 字數 1752 閱讀 2338

現在我們的手頭有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 10

5 5 6

2 3 4

0 1 1

輸出樣例#1:

5

f[u][i]表示安裝u占用i的記憶體能得到的最大價值

1 #include 2 #include 3

4using

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的直接或間接依賴 的情況下才能正確工作 ...