[BZOJ1040][ZJOI2008]骑士

昨天做错了,没遇到环就开搜。今天改之。

话说在洛谷上被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;
}

 

posted @ 2016-01-05 17:46  海豚爸爸  阅读(151)  评论(0编辑  收藏  举报