您的位置:首页 > 其它

poj1848 树状DP

2013-03-22 23:08 141 查看
很好的题目,一开始没想到状态怎么表示,然后看了题解,自己把转移方程推了一下,思路跟网上的一样,这里就不再赘述了。

ACcode:

#include<cstdio>
#include<cstring>

const int ns=111;
const int INF=100000000;

int n,top,dp[ns][3],v[ns];
int head[ns],to[ns<<1],next[ns<<1];

void add(int p,int s)
{
next[top]=head[p];
to[top]=s;
head[p]=top++;
}

int Min(int a1,int a2)
{
return a1<a2?a1:a2;
}

void dfs(int rt)
{
v[rt]=0;
int sum,min1,min2,min3,e,t;
sum=0,min1=min2=min3=INF;
for (int i=head[rt];i!=-1;i=next[i])
{
e=to[i];
if (v[e])
{
dfs(e);
sum+=dp[e][0];
t=Min(dp[e][1],dp[e][2])-dp[e][0];
if (t<min1)
{
min2=min1;
min1=t;
}
else if (t<min2)
{
min2=t;
}
min3=Min(min3,dp[e][2]-dp[e][0]);
}
}
dp[rt][1]=sum;
dp[rt][2]=sum+min1;
dp[rt][0]=1+sum+Min(min1+min2,min3);
}

int main()
{
int x,y;
while (~scanf("%d",&n))
{
top=0;
memset(v,1,sizeof(v));
memset(dp,0,sizeof(dp));
memset(head,-1,sizeof(head));
for (int i=1;i<n;i++)
{
scanf("%d %d",&x,&y);
add(x,y),add(y,x);
}
dfs(1);
if (dp[1][0]<INF) printf("%d\n",dp[1][0]);
else printf("%d\n",-1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: