技术支持 东莞网站建设防水工程网站开发申请微信支付
web/
2025/10/7 18:08:36/
文章来源:
技术支持 东莞网站建设防水工程,网站开发申请微信支付,社保网上服务平台,物流网站后台2427: [HAOI2010]软件安装 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 960 Solved: 380[Submit][Status][Discuss]Description 现在我们的手头有N个软件#xff0c;对于一个软件i#xff0c;它要占用Wi的磁盘空间#xff0c;它的价值为Vi。我们希望从中选择一些软件… 2427: [HAOI2010]软件安装 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 960 Solved: 380[Submit][Status][Discuss] Description 现在我们的手头有N个软件对于一个软件i它要占用Wi的磁盘空间它的价值为Vi。我们希望从中选择一些软件安装到一台磁盘容量为M计算机上使得这些软件的价值尽可能大即Vi的和最大。但是现在有个问题软件之间存在依赖关系即软件i只有在安装了软件j包括软件j的直接或间接依赖的情况下才能正确工作软件i依赖软件j)。幸运的是一个软件最多依赖另外一个软件。如果一个软件不能正常工作那么它能够发挥的作用为0。我们现在知道了软件之间的依赖关系软件i依赖软件Di。现在请你设计出一种方案安装价值尽量大的软件。一个软件只能被安装一次如果一个软件没有依赖则Di0这时只要这个软件安装了它就能正常工作。 Input 第1行N, M 0N100, 0M500 第2行W1, W2, ... Wi, ..., Wn 0WiM 第3行V1, V2, ..., Vi, ..., Vn 0Vi1000 第4行D1, D2, ..., Di, ..., Dn 0DiN, Di≠i Output 一个整数代表最大价值。 Sample Input 3 10 5 5 6 2 3 4 0 1 1 Sample Output 5 HINT Source Day2 Solution 把环缩成一个点... 建立超级根0.... 然后树形01背包 Code #includeiostream
#includecstdio
#includecstring
#includealgorithm
#includecmath
using namespace std;
inline int read()
{int x0,f1; char chgetchar();while (ch0 || ch9) {if (ch-) f-1; chgetchar();}while (ch0 ch9) {xx*10ch-0; chgetchar();}return x*f;
}
#define MAXN 110
#define MAXM 510
struct EdgeNode{int next,to;}edge[MAXN1],road[MAXN1];
int head[MAXN],cnt1,first[MAXN],tot1;
inline void AddEdge(int u,int v) {cnt; edge[cnt].nexthead[u]; head[u]cnt; edge[cnt].tov;}
inline void InsertEdge(int u,int v) {if (!u) return; AddEdge(u,v);}
int w[MAXN],v[MAXN],V[MAXN],W[MAXN],N,M;
int dfn[MAXN],low[MAXN],st[MAXN],top,visit[MAXN],belong[MAXN],size[MAXN],dfsn,scc;
inline void Tarjan(int x)
{dfn[x]low[x]dfsn; visit[x]1; st[top]x;for (int ihead[x]; i; iedge[i].next)if (!dfn[edge[i].to]) Tarjan(edge[i].to),low[x]min(low[x],low[edge[i].to]);else if (visit[edge[i].to]) low[x]min(dfn[edge[i].to],low[x]);if (dfn[x]low[x]){int stp0;scc;while (x!stp) stpst[top--],size[scc],W[scc]w[stp],V[scc]v[stp],belong[stp]scc,visit[stp]0;}
}
inline void AddRoad(int u,int v) {tot; road[tot].nextfirst[u]; first[u]tot; road[tot].tov;}
inline void InsertRoad(int u,int v) {AddRoad(u,v); AddRoad(v,u);}
bool flag[MAXN];
inline void Rebuild()
{for (int i1; iN; i)for (int jhead[i]; j; jedge[j].next)if (belong[i]!belong[edge[j].to])InsertRoad(belong[i],belong[edge[j].to]),flag[belong[edge[j].to]]1;for (int i1; iscc; i) if (!flag[i]) InsertRoad(0,i);
}
int f[MAXN][MAXM],g[MAXN][MAXM];
void DP(int x,int last)
{ for (int ifirst[x]; i; iroad[i].next)if (road[i].to!last){DP(road[i].to,x);for (int jM-W[x]; j0; j--)for (int k0; kj; k)g[x][j]max(g[x][j],g[x][k]f[road[i].to][j-k]);}for (int i0; iM-W[x]; i) f[x][iW[x]]g[x][i]V[x];
}
int main()
{Nread(),Mread();for (int i1; iN; i) w[i]read();for (int i1; iN; i) v[i]read();for (int f,i1; iN; i) fread(),InsertEdge(f,i);for (int i1; iN; i) if (!dfn[i]) Tarjan(i);Rebuild();DP(0,0);printf(%d\n,f[0][M]);return 0;
} 转载于:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5882604.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/88610.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!