POJ 3398 Perfect Service(트리 DP)
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
#define maxn 11111
#define INF 0x3f3f3f3f
typedef long long ll;
struct Edge
{
int to,next;
}edge[2*maxn];
int n,head[maxn],tot;
int dp[maxn][3];
void init()
{
tot=0;
memset(head,-1,sizeof(head));
for(int i=0;i<maxn;i++)dp[i][1]=INF;
}
void add(int u,int v)
{
edge[tot].to=v;
edge[tot].next=head[u];
head[u]=tot++;
}
void DP(int u,int fa)
{
dp[u][0]=1,dp[u][2]=0;
int sum=0,inc=INF,flag=0;
for(int i=head[u];~i;i=edge[i].next)
{
int v=edge[i].to;
if(v==fa)continue;
DP(v,u);
dp[u][0]+=min(dp[v][0],dp[v][2]);
if(dp[v][0]<=dp[v][1])
sum+=dp[v][0],flag=1;
else sum+=dp[v][1],inc=min(inc,dp[v][0]-dp[v][1]);
if(dp[v][1]!=INF&&dp[u][2]!=INF)dp[u][2]+=dp[v][1];
else dp[u][2]=INF;
}
if(inc!=INF&&!flag)dp[u][1]=INF;
else
{
dp[u][1]=sum;
if(!flag)dp[u][1]+=inc;
}
}
int main()
{
while(~scanf("%d",&n))
{
init();
int u,v,t;
for(int i=1;i<n;i++)
{
scanf("%d%d",&u,&v);
add(u,v),add(v,u);
}
DP(1,1);
int ans=min(dp[1][0],dp[1][1]);
printf("%d
",ans);
scanf("%d",&t);
if(t!=0)break;
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.