需要安裝n個軟體,每個軟體會占用wi的空間,價值為vi
計算機總容量為m,要使這些軟體的價值盡可能大
但軟體之間存在依賴關係,即只有安裝了前提軟體,這個軟體才有價值
求出結果
如果只是普通的依賴關係,那麼這些關係構成了一棵樹
顯然使用樹形dp,\(dp[i][j]\)表示以 \(i\) 為根的子樹中使用不超過 \(j\) 的空間的最大價值
縮點?tarjan準備上啊
縮完以後就是乙個簡單地樹形dp了,思路如上
**:
#include#define n 2005
using namespace std;
int n,m;
int w[n],v[n],x[n],y[n];
struct edge
edge[n<<2];
int cnt=0,head[n];
inline void add_edge(int from,int to)
templateinline void read(t &res)
int tms=0,low[n],dfn[n],color[n];
int sta[n],top=0;
bool vis[n];
int colorcnt=0;
void tarjan(int u)
else if(vis[v])
}if(dfn[u]==low[u]) }
}int ww[n],vv[n],idx[n];
int dp[n][n];
void dfs(int u) }}
int main()
for(register int i=1;i<=n;++i) if(!dfn[i]) tarjan(i);
memset(edge,0,sizeof(edge));
memset(head,0,sizeof(head));
for(register int i=1;i<=n;++i) }
for(register int i=1;i<=colorcnt;++i)
if(!idx[i]) add_edge(colorcnt+1,i);
dfs(colorcnt+1);
printf("%d\n",dp[colorcnt+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...