社区讨论
一直超时四十分求助谢谢各位!
P2515[HAOI2010] 软件安装参与者 3已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lobsvxd4
- 此快照首次捕获于
- 2023/10/30 02:24 2 年前
- 此快照最后确认于
- 2023/11/04 06:53 2 年前
CPP
#include<stack>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=105,M=505;
struct edge{
int Next,to;
}e[N];
int n,m,col,tot,Head[N],val[N],cost[N],W[N],V[N],color[N],a[N],dfn[N],low[N],f[N][M];
bool flag[N],vis[N];
inline int read(){
int k=0;char ch=getchar();
while (!isdigit(ch)) ch=getchar();
while (isdigit(ch)){
k=(k<<1)+(k<<3)+(ch&15);
ch=getchar();
}
return k;
}
inline void add(int u,int v){
e[++tot].Next=Head[u];
e[tot].to=v;
Head[u]=tot;
}
stack<int> s;
int tim=0;
inline void Tarjan(int u){
dfn[u]=low[u]=++tim;
s.push(u);
for (int i=Head[u];~i;i=e[i].Next){
int v=e[i].to;
if (!dfn[v]){
Tarjan(v);
low[u]=min(low[u],low[v]);
}else if (!color[v]) low[u]=min(low[u],dfn[v]);
}
if (low[u]==dfn[u]){
color[u]=++col;
int i=s.top();
while (i!=u){
color[i]=col;
V[col]+=val[i];
W[col]+=cost[i];
s.pop();
i=s.top();
}
V[col]+=val[u];
W[col]+=cost[u];
s.pop();
}
}
inline void dfs(int u){
if (vis[u]) return;
vis[u]=1;
for (int i=W[u];i<=m;i++) f[u][i]=V[u];
for (int i=Head[u];~i;i=e[i].Next){
int v=e[i].to;
dfs(v);
for (int j=m-W[u];~j;j--)
for (int k=0;k<=j;k++)
f[u][j+W[u]]=max(f[u][j+W[u]],f[v][k]+f[u][j+W[u]-k]);
}
}
int main(){
memset(Head,-1,sizeof(Head));
n=read();m=read();
for (int i=1;i<=n;i++) cost[i]=read();
for (int i=1;i<=n;i++) val[i]=read();
for (int i=1;i<=n;i++){
a[i]=read();
if (a[i]) add(a[i],i);
}
for (int i=1;i<=n;i++) if (!dfn[i]) Tarjan(i);
memset(Head,-1,sizeof(Head));
memset(e,0,sizeof(e));
tot=0;
memset(flag,1,sizeof(flag));
for (int i=1;i<=n;i++){
if (color[a[i]]!=color[i]){
add(color[a[i]],color[i]);
flag[color[i]]=0;
}
}
for (int i=1;i<=col;i++) if (flag[i]) add(0,i);
dfs(0);
printf("%d\n",f[0][m]);
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...