昨天做错了,没遇到环就开搜。今天改之。
话说在洛谷上被1秒卡掉一个解,算了不改了。
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
typedef long long LL;
typedef struct{
int val,next,type; // type:0-未定, 1-树上(不含根), 2-环中
LL x0,x1;
vector<int> prev;
} NODE;
vector<NODE> node;
int n;
inline void getInt(int &x) {
int ch;
x=0;
while((ch=getchar())&&ch>='0'&&ch<='9') x=x*10+ch-'0';
}
void init(){
NODE node1={0,};
getInt(n); // cin>>n;
for(int i=0;i<=n;i++) node.push_back(node1);
for(int i=1;i<=n;i++){
getInt(node[i].val); getInt(node[i].next); // cin>>node[i].val>>node[i].next;
node[i].type=0;
node[node[i].next].prev.push_back(i);
}
for(int i=1;i<=n;i++) if(node[i].type==0){
int j;
for(j=i;node[j].type==0;j=node[j].next) node[j].type=9; // 临时 9
for(;node[j].type==9;j=node[j].next) node[j].type=2; // 环上 2
for(j=i;node[j].type==9;j=node[j].next) node[j].type=1; // 树上 1
}
}
void dfs(int x){
node[x].x1=node[x].val; node[x].x0=0;
for(int i=0;i<node[x].prev.size();i++){
int j=node[x].prev[i];
if (node[j].type==1) {
dfs(j);
node[x].x1+=node[j].x0;
node[x].x0+=max(node[j].x0,node[j].x1);
}
}
}
LL anser(){
LL ans=0;
for(int i=1;i<=n;i++) if(node[i].type==2) {
vector<int> t;
LL u0=0,u1=0,v0,w;
for(int j=i;node[j].type==2;j=node[j].next){
node[j].type=3; t.push_back(j);
v0=max(u0,u1)+node[j].x0;
u1=u0+node[j].x1; u0=v0;
}
w=u0;
u0=u1=0;
for(int j=t.size()-1;j>=0;j--){
v0=max(u0,u1)+node[t[j]].x0;
u1=u0+node[t[j]].x1; u0=v0;
}
ans+=max(w,u0);
}
return ans;
}
int main(){
ios_base::sync_with_stdio(false);
init();
for(int i=1;i<=n;i++) if(node[i].type==2) dfs(i);
cout<<anser()<<endl;
return 0;
}