HAOI2010 軟體安裝

2022-05-26 07:12:09 字數 1198 閱讀 1093

需要安裝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...