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...