BZOJ 2427 HAOI2010 軟體安裝

2022-04-30 05:54:08 字數 1316 閱讀 9818

bzoj_2427_[haoi2010]軟體安裝_tarjan+樹形dp

題意:

現在我們的手頭有n個軟體,對於乙個軟體i,它要占用wi的磁碟空間,它的價值為vi。我們希望從中選擇一些軟體安裝到一台磁碟容量為m計算機上,使得這些軟體的價值盡可能大(即vi的和最大)。

但是現在有個問題:軟體之間存在依賴關係,即軟體i只有在安裝了軟體j(包括軟體j的直接或間接依賴)的情況下才能正確工作(軟體i依賴軟體j)。幸運的是,乙個軟體最多依賴另外乙個軟體。如果乙個軟體不能正常工作,那麼它能夠發揮的作用為0。

我們現在知道了軟體之間的依賴關係:軟體i依賴軟體di。現在請你設計出一種方案,安裝價值盡量大的軟體。乙個軟體只能被安裝一次,如果乙個軟體沒有依賴則di=0,這時只要這個軟體安裝了,它就能正常工作。

分析:

有環。考慮乙個環內的貢獻

要麼都取要麼都不取

縮個點跑樹形揹包就可以了

**:

#include #include #include using namespace std;

#define n 350

int head[n],to[n<<1],nxt[n<<1],cnt,n;

int m,f[n][600],cost[n],val[n],c[n],v[n],in[n];

int st[n],top,ins[n],bl[n],scc,tot,vis[n];

int dfn[n],low[n],from[n];

inline void add(int u,int v)

void tarjan(int x)else if(ins[to[i]])

}if(low[x]==dfn[x])

}}void dfs(int x,int y)}}

}}int main()

for(i=1;i<=n;i++)if(!dfn[i])tarjan(i);

int tmp=cnt;

memset(head,0,sizeof(head));cnt=0;

for(i=1;i<=tmp;i++)

}for(i=1;i<=scc;i++)if(!in[i])

dfs(scc+1,0);

int ans=0;

for(i=0;i<=m;i++)ans=max(ans,f[scc+1][i]);

printf("%d\n",ans);}/*

3 10

5 5 6

2 3 4

0 1 1

*/

BZOJ 2427 HAOI2010 軟體安裝

time limit 10 sec memory limit 128 mb submit 2146 solved 865 submit status discuss description 現在我們的手頭有n個軟體,對於乙個軟體i,它要占用wi的磁碟空間,它的價值為vi。我們希望從中選擇一些軟體安裝...

BZOJ2427 HAOI2010 軟體安裝

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

bzoj2427 軟體安裝

軟體安裝 題目背景 bzoj2427 分析 樹型dp 原圖有環 並且好像有和其他部分不連通的單個環 這個題,顯然應該是一些環和一些樹放到一起,那麼顯然的對於乙個環要麼全部選擇,要麼乙個都不選,那麼我們先 tarjan 縮點一發每乙個 scc的 w為原來所有 w的和,v為原來所有的 v和,然後就成了一...