poj 1192 最优连通子集
2012-03-24 22:39
162 查看
题目链接:http://poj.org/problem?id=1192
题目大意:求一棵树的最大权连通子集,开始做树形dp的时候错误的认为整棵子树都要加进去,后来才发现错误。
题目大意:求一棵树的最大权连通子集,开始做树形dp的时候错误的认为整棵子树都要加进去,后来才发现错误。
#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 1100 int max(int a,int b) { return a>b?a:b; } int min(int a,int b) { return a<b?a:b; } int x[Max],y[Max],val[Max],dp[Max]; int p[Max],sum[Max]; int eid=0,n,ans=0,cnt=0; struct node { int to,next; }e[Max*5]; void addedge(int u,int v) { e[eid].to=v; e[eid].next=p[u]; p[u]=eid++; } void dfs(int u) { int v,i; sum[u]=val[u]; dp[u]=val[u]; for(i=p[u];i!=-1;i=e[i].next) { v=e[i].to; if(sum[v]==inf) { dfs(v); if(dp[v]>0) sum[u]+=dp[v]; dp[u]=max(dp[u],dp[v]+val[u]); } } dp[u]=max(dp[u],sum[u]); if(dp[u]>ans) ans=dp[u]; //printf("u %d sum %d\n",u,sum[u]); } int main() { int i,j; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d%d%d",&x[i],&y[i],&val[i]); cnt+=val[i]; sum[i]=inf; } memset(p,-1,sizeof(p)); for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(i==j) continue; if((x[i]==x[j]&&(y[i]-y[j]==1||y[i]-y[j]==-1))||((y[i]==y[j])&&(x[i]-x[j]==1||x[i]-x[j]==-1))) { addedge(i,j); } } } // printf("%d %d \n",eid,cnt); dfs(0); printf("%d\n",ans); }
相关文章推荐
- POJ-1192 最优连通子集 动态规划
- POJ 1192 最优连通子集【树形DP】
- POJ-1192 最优连通子集(树形DP入门+模板)
- poj 1192最优连通子集(简单树形dp)
- POJ 1192 最优连通子集(树上DP)
- poj 1192-最优连通子集解题报告
- POJ1192 最优连通子集(树形DP)
- POJ 1192 最优连通子集 (树形dp)
- POJ - 1192 最优连通子集 (树形DP)
- poj 1192 最优连通子集
- poj 1192 最优连通子集 树状dp
- poj 1192 最优连通子集 树的孩子兄弟表示法+简单树型dp
- POJ1192最优连通子集(树状dp)
- POJ 1192 最优连通子集 最详细的题解 (无向树树形DP)
- POJ 1192 -最优连通子集 树形DP
- poj1192(记忆化搜索)最优连通子集
- poj 1192 最优连通子集(树形dp)题目好难懂。。。
- poj 1192 最优连通子集 树状dp
- pku1192 最优连通子集
- poj 1192 最优联通子集 简单dp