블루 브리지 컵 - 결점 선택

1367 단어
문제 설명
n개의 노드가 있는 나무는 나무마다 정정수 권한이 있다.만약 점 하나가 선택된다면, 나무에 그와 인접한 점은 모두 선택할 수 없다.선택한 점의 권한과 최대는 얼마입니까?
문제 해결 방법:
이 모형은 트리 동태 기획 입문 제목,
dp[i][0]는 이 노드가 선택되지 않았음을 나타내고 dp[i][1]은 이 결점이 선택되었음을 나타낸다.
변환 방정식은 다음과 같습니다.
dp[u][1]+=dp[v][0];//u 결점을 선택하면 그와 인접한 결점을 선택하지 않는다.
dp[u][0]+=max(dp[v][0],dp[v][1]);u결점을 선택하지 않으면 그와 인접한 결점이 가장 큰 결과를 선택한다.
특히 주의해야 할 것은 이 문제의 결점 수량이 비교적 많기 때문에 인접표 저장변의 관계를 선택해야 한다
#include
#include
#define max(a,b) ((a)>(b)?(a):(b))
#define maxn 100010
bool vis[maxn];
int dp[maxn][2];
int father[maxn];
int head[maxn];
int n;
int cnt;
struct Edge
{
	int to,next;
}edge[2*maxn];
void add(int u,int v)
{
	edge[cnt].to=v;
	edge[cnt].next=head[u];
	head[u]=cnt++;
}
void treedp(int u)
{
	vis[u]=1;
	for(int i=head[u];i!=-1;i=edge[i].next)
	{
		int v=edge[i].to;
		if(!vis[v])
		{
			treedp(v);
			dp[u][1]+=dp[v][0];
			dp[u][0]+=max(dp[v][1],dp[v][0]);
		}
	}
}
void init()
{
	cnt=0;
	memset(dp,0,sizeof(dp));
	memset(father,0,sizeof(father));
	memset(vis,0,sizeof(vis));
	memset(head,-1,sizeof(head));
}
int main()
{
	init();
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	scanf("%d",&dp[i][1]);
	int root=0;
	int begin=1;
	for(int i=0;i

좋은 웹페이지 즐겨찾기