poj 1848 Tree
2012-04-10 10:36
302 查看
题目链接:http://poj.org/problem?id=1848
题目思路:这个题目的思路还真是相当难想到啊!膜拜大牛。。网上有详细题解,我就不写了。。
题目思路:这个题目的思路还真是相当难想到啊!膜拜大牛。。网上有详细题解,我就不写了。。
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<string> #include<queue> #include<algorithm> #include<vector> #include<stack> #include<list> #include<iostream> #include<map> using namespace std; #define inf 0x3f3f3f3f #define Max 110 int max(int a,int b) { return a>b?a:b; } int min(int a,int b) { return a<b?a:b; } struct node { int to,next; }e[2*110]; int p[110],eid,n; int dp[110][3]; inline void addedge(int u,int v) { e[eid].to=v; e[eid].next=p[u]; p[u]=eid++; } void dfs(int u,int pre) { int v,sum=0,i,j; dp[u][0]=dp[u][2]=1000; for(i=p[u];i!=-1;i=e[i].next) { v=e[i].to; if(v==pre) continue; dfs(v,u); sum+=dp[v][0]; } dp[u][1]=sum; for(i=p[u];i!=-1;i=e[i].next) { v=e[i].to; if(v==pre) continue; dp[u][2]=min(dp[u][2],sum-dp[v][0]+min(dp[v][1],dp[v][2])); dp[u][0]=min(dp[u][0],sum-dp[v][0]+dp[v][2]+1); for(j=p[u];j!=-1;j=e[j].next) { int v2=e[j].to; if(i==j||v2==pre) continue; dp[u][0]=min(dp[u][0],sum-dp[v][0]-dp[v2][0]+min(dp[v][1],dp[v][2])+min(dp[v2][1],dp[v2][2])+1); } } // printf("%d %d %d %d\n",u,dp[u][0],dp[u][1],dp[u][2]); } int main() { int i,j,u,v; while(scanf("%d",&n)!=EOF) { eid=0; memset(p,-1,sizeof(p)); for(i=1;i<n;i++) { scanf("%d%d",&u,&v); addedge(u,v); addedge(v,u); } dfs(1,0); if(dp[1][0]>=1000) printf("-1\n"); else printf("%d\n",dp[1][0]); } }
相关文章推荐
- poj1848 Tree
- poj 1848 Tree 树形dp
- poj 1848 Tree
- POJ 1848 Tree
- poj 1848 Tree
- POJ 1848 Tree 树形DP
- 【POJ 1848】Tree【树形DP】
- POJ 1848 Tree
- poj 1848 Tree
- poj 1848 Tree 树形dp
- poj 1848 Tree 树型dp
- POJ 1848 Tree
- POJ 1848 Tree
- poj 1848 Tree(树形DP,太难了,三种状态,四种状态转换)
- POJ 1848 Tree
- poj Is It A Tree?(并查集)(连通无环图)
- poj&nbsp;3013&nbsp;Big&nbsp;Christmas&nbsp;Tree&nbsp;(解…
- POJ 1308 Is It A Tree(模拟题)
- POJ 2255 Tree Recovery && Ulm Local 1997 Tree Recovery (二叉树的前中后序遍历)
- POJ - 1741 Tree 树的分治