只有50pts.
WA on #2 #5 #6 #7 #9
求助啊啊啊啊啊, 有没有dalao能看出哪里错了。。
感觉和城市环路蛮像的?
代码:
#include<bits/stdc++.h>
#define maxm 5000010
#define maxn 5000010
using namespace std;
int n;
struct EDGE
{
int v;
int nxt;
}edge[maxm];
int head[maxn],totedge=1;
void addedge(int u,int v)
{
totedge++;
edge[totedge].v=v;
edge[totedge].nxt=head[u];
head[u]=totedge;
}
struct NODE
{
bool inr;
int val;
}tree[maxn];
int vir[maxn];
vector<int>r;
int findr(int p,int fa)
{
vir[p]=p;
for(int i=head[p];i;i=edge[i].nxt)
{
int v=edge[i].v;
if(v==fa)continue;
if(vir[v])
{
r.push_back(p);
tree[p].inr=true;
return vir[v];
}
else
{
int tmp=findr(v,p);
if(tmp)
{
r.push_back(p);
tree[p].inr=true;
if(p==tmp)
return false;
return tmp;
}
}
}
return false;
}
bool vis[maxn];
void dfs(int p)
{
vis[p]=1;
for(int i=head[p];i;i=edge[i].nxt)
{
int v=edge[i].v;
if(vis[v])continue;
dfs(v);
}
}
int f1[maxn][2];
void dp(int p,int fa)
{
f1[p][1]=tree[p].val;
for(int i=head[p];i;i=edge[i].nxt)
{
int v=edge[i].v;
if(v==fa||tree[v].inr)
continue;
dp(v,p);
f1[p][0]+=max(f1[v][0],f1[v][1]);
f1[p][1]+=f1[v][0];
}
}
int f2[maxn][2];
int ans=0;
int res=0;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin>>n;
for(int i=1;i<=n;i++)
{
int w,v;
cin>>tree[i].val>>v;
addedge(i,v);
addedge(v,i);
}
for(int i=1;i<=n;i++)
{
int res=0;
if(vis[i])continue;
findr(i,0);
dfs(i);
int l=r.size();
for(int i=0;i<l;i++)
dp(r[i],0);
f2[0][0]=f1[r[0]][0];
f2[0][1]=0;
for(int i=1;i<l;i++)
{
f2[i][0]=max(f2[i-1][0],f2[i-1][1])+f1[r[i]][0];
f2[i][1]=f2[i-1][0]+f1[r[i]][1];
}
res=max(res,max(f2[l-1][1],f2[l-1][0]));
memset(f2,0,sizeof(f2));
f2[0][0]=0;
f2[0][1]=f1[r[0]][1];
for(int i=1;i<l;i++)
{
f2[i][0]=max(f2[i-1][0],f2[i-1][1])+f1[r[i]][0];
f2[i][1]=f2[i-1][0]+f1[r[i]][1];
}
ans+=max(res,f2[l-1][0]);
r.clear();
memset(f2,0,sizeof(f2));
}
cout<<ans<<"\n";
return 0;
}