社区讨论

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 条回复,欢迎继续交流。

正在加载回复...