HAOI2010 軟體安裝

2022-08-20 23:09:15 字數 895 閱讀 7245

here

這題的樹形 \(dp\) 很明顯,我們發現只可能有兩種情況,要麼是樹要麼是環,對於乙個環來說肯定是要麼都選要麼都不選,可以縮點,縮完點之後我們得到了乙個森林,不妨用乙個源點將這些小樹串成乙個大樹再來 \(dp\),後面就顯然是乙個樹上有條件的分組揹包了,由於必須要選當前點,所以強制選當前點再 \(dp\) 就好 ~

#includeusing namespace std;

const int m = 550;

const int n = 110;

struct nodeedge[n << 1], e[n << 1];

int head[n], num, h[n], num2;

void build(int from, int to)

void build2(int from, int to)

int dfn[n], low[n], vis[n], s[n], col[n], sumv[n], sumw[n], val[n], w[n], du[n], top, cnt, color;

void tarjan(int u)

if(low[u] == dfn[u])

top --;

}}int n, m;

int f[n][m], sz[n];

void dp(int u, int fa)}}

}int main()

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

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

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

dp(color+1, 0);

cout << f[color+1][m];

return 0;

}

注意細節吧

HAOI2010 軟體安裝

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

HAOI2010 軟體安裝

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

HAOI2010 軟體安裝

開始沒有看懂題,以為就是個樹形依賴揹包,打完之後w40,然後才發現它會有還,要用tarjan縮完點後跑揹包,要建立乙個虛擬節點0連線所有的子圖 注意連線的位置 錯誤示範 1 for int i 1 i n i 這樣會導致0連線的不是入度為0的點 或環 2if dsn i 3 正確 1 for int...