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;
}
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;
}
相关文章推荐
- ACM: 树状DP 动态规划题 poj 1463 …
- poj 1655 Balancing Act 树状DP,求树的质心
- poj 2378 Tree Cutting 树状dp
- POJ_1947_Rebuilding Roads_树状DP
- POJ 2342 树状dp
- POJ 1655 Balancing Act(简单树状DP)
- poj 1848 树形dp(添加最少的边每点都恰在一个圈中)
- POJ_2486_Apple Tree_树状DP
- POJ 1463 树状dp
- poj 1848 树形dp
- poj 3342 Party at Hali-Bula 树状dp
- POJ 3107 Godfather 树状DP
- poj1155(树状DP)
- poj 1848 Tree 树形dp
- POJ 1947 Rebuilding Roads(树状DP)
- POJ 1155 树状dp
- POJ 1947 Rebuilding Roads【树状DP】
- poj 1192 最优连通子集 树状dp
- POJ 1155 TELE 树状DP
- POJ 1155 TELE (树状DP)