社区讨论
玄关,样例都 RE 求调
P2607[ZJOI2008] 骑士参与者 3已保存回复 8
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 8 条
- 当前快照
- 1 份
- 快照标识符
- @mhjht8tt
- 此快照首次捕获于
- 2025/11/04 02:48 4 个月前
- 此快照最后确认于
- 2025/11/04 02:48 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
struct edge{
int to,nxt;
}e[2000005];
int hd[1000005],tot;
long long ans,f[1000005][2];
int w[1000005],vis[1000005];
int x1,x2,E;
void add(int u,int v){
e[++tot].to=v;
e[tot].nxt=hd[u];
hd[u]=tot;
}
void dfs(int u,int pre){
f[u][1]=w[u];
f[u][0]=0;
for(int i=hd[u];i;i=e[i].nxt){
int v=e[i].to;
if(i==E||i==(E^1)) continue;
if(v==pre) continue;
dfs(v,u);
f[u][1]+=f[v][0];
f[u][0]+=max(f[v][0],f[v][1]);
}
}
void find(int u,int pre){
vis[u]=1;
for(int i=hd[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==pre) continue;
if(vis[v]){
x1=u;
x2=v;
E=i;
continue;
}
find(v,u);
}
}
int main(){
int n;cin>>n;
for(int i=1;i<=n;i++){
int p;cin>>w[i]>>p;
add(i,p);add(p,i);
}
for(int i=1;i<=n;i++){
if(vis[i]) continue;
find(i,-1);
dfs(x1,-1);
long long tmp=f[x1][0];
dfs(x2,-1);
tmp=max(tmp,f[x2][0]);
ans+=tmp;
}
cout<<ans;
return 0;
}
回复
共 8 条回复,欢迎继续交流。
正在加载回复...