YY_More

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

水背包。。。做道水题。。。不解释。。。

//By YY_More
#include<cstdio>
#include<cstring>
struct edge{
	int point;
	edge *next;
};	
int N,M,a,b,V[201],F[201][210];
edge *g[201];	
void insert(int fa,int so,int data){
	edge *p=new edge;
	(*p).point=so;
	(*p).next=g[fa];
	g[fa]=p;
	V[so]=data;
};	
void dp(int x){
	F[x][0]=0;
	edge *p=g[x];
	while (p!=NULL){
		dp((*p).point);
		for (int i=M;i>0;i--)
			for (int j=0;j<i;j++)
				if (F[x][j]!=-1&&F[(*p).point][i-j]!=-1&&F[x][j]+F[(*p).point][i-j]>F[x][i])
					F[x][i]=F[x][j]+F[(*p).point][i-j];
		p=(*p).next;
	}
	for (int i=M;i>=0;i--)
		if (F[x][i]!=-1) F[x][i+1]=F[x][i]+V[x];
};	
int main(){
	while (~scanf("%d%d",&N,&M)){
		if (N==0) break;
		memset(g,0,sizeof(g));	
		for (int i=1;i<=N;i++){
			scanf("%d%d",&a,&b);
			insert(a,i,b);
		}	
		memset(F,-1,sizeof(F));
		M++;
		dp(0);
		printf("%d\n",F[0][M]);
		}
	return 0;
}

然后又写了一个更快的

//By YY_More
#include<cstdio>
#include<cstring>
struct edge{
	edge *next;
	int point;
};	
int value[201],F[201][201],N,M,a,b;
edge *g[201];
void insert(int from,int to){
	edge *p=new edge;
	(*p).next=g[from];
	g[from]=p;
	(*p).point=to;
};	
void dfs(int x,int v){
	edge *p=g[x];
	while (p!=NULL){
		for (int i=v+1;i<=M;i++) F[(*p).point][i]=F[x][i-1]+value[(*p).point];
		dfs((*p).point,v+1);
		for (int i=v+1;i<=M;i++) if (F[(*p).point][i]>F[x][i]) F[x][i]=F[(*p).point][i];
		p=(*p).next;
	}
}	
int main(){
	while (~scanf("%d%d",&N,&M)){
		if (N==0) break;
		M++;	
		memset(g,0,sizeof(g));
		for (int i=1;i<=N;i++){
			scanf("%d%d",&a,&b);
			insert(a,i);
			value[i]=b;
		}
		memset(F,0,sizeof(F));
		dfs(0,1);
		printf("%d\n",F[0][M]);
	}
	return 0;
}
posted on 2011-07-04 18:02  YY_More  阅读(269)  评论(0编辑  收藏  举报