社区讨论
QAQ第三个点挂了 ball ball大佬来看看
P2458[SDOI2006] 保安站岗参与者 2已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mi7pxt9e
- 此快照首次捕获于
- 2025/11/21 01:42 4 个月前
- 此快照最后确认于
- 2025/11/21 01:42 4 个月前
#include<bits/stdc++.h>
using namespace std;
const int N=1500+5;
const int inf=0x3f3f;
int n,k[N],f[N][3];
int cnt=0,head[N<<1];
int read()
{
int x=0,w=0;char ch=0;
while(!isdigit(ch)) w|=ch=='-',ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return w?-x:x;
}
struct edge
{
int v,nxt;
}e[N<<1];
void add(int u,int v)
{
e[++cnt].v=v;
e[cnt].nxt=head[u];
head[u]=cnt;
}
void dp(int u,int fa)
{
f[u][0]=k[u];
bool yes=0;int minc=inf;
for(int i=head[u];i!=0;i=e[i].nxt)
{
int v=e[i].v;
if(v==fa) continue;
dp(v,u);
int t=min(f[v][0],f[v][1]);
f[u][0]+=min(f[v][2],t);//自己覆盖自己
f[u][2]+=t;//被父亲覆盖
if(f[v][0]<f[v][1]) yes=1;
else minc=min(minc,f[v][0]-f[v][1]);
f[u][1]+=t;//被儿子覆盖
}
if(yes==0) f[u][1]+=minc;
}
int main()
{
n=read();
for(int i=1;i<=n;i++)
{
int ii,m;
ii=read(),k[i]=read(),m=read();
while(m--)
{
int r=read();
add(ii,r);add(r,ii);
}
}
dp(1,0);
printf("%d",min(f[1][0],f[1][1]));
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...