lightoj 1201 - A Perfect Murder 树形DP
2016-04-05 11:13
309 查看
题意和hdu1520类似,就是选择一个点后,与这个点有边相连的都不能选..问最多选多少个点。
写法也和hdu1520类似..树形DP入门题..
dp[i][0]代表没选i这个点最多选择多少点,dp[i][1]选择了i这个点最多能选多少个点。
这个题没说图一定联通...
终于在lightoj刷到树形DP了...
写法也和hdu1520类似..树形DP入门题..
dp[i][0]代表没选i这个点最多选择多少点,dp[i][1]选择了i这个点最多能选多少个点。
这个题没说图一定联通...
终于在lightoj刷到树形DP了...
#include<bits/stdc++.h> using namespace std; #define ll long long #define ull unsigned long long #define mod 100000007 #define inf 0x3f3f3f3f int f[1234]; int dp[1234][2],head[1234],tot,used[1234]; struct edge { int u,v,next; }edge[1234*1234]; void init(int n) { memset(head,-1,sizeof(head)); memset(used,0,sizeof(used)); tot=0; for(int i=0;i<=n;i++) f[i]=i; } void add(int u,int v) { edge[tot].v=v; edge[tot].next=head[u]; head[u]=tot++; } int finde(int x) { if(x!=f[x]) return f[x]=finde(f[x]); return x; } void dfs(int u) { dp[u][0]=0; dp[u][1]=1; used[u]=1; for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].v; if(used[v]) continue; dfs(v); dp[u][0]+=max(dp[v][1],dp[v][0]); dp[u][1]+=dp[v][0]; } } int main() { int t; scanf("%d",&t); for(int cas=1;cas<=t;cas++) { int n,m,v,u; scanf("%d %d",&n,&m); init(n); for(int i=0;i<m;i++) { scanf("%d %d",&u,&v); add(u,v); add(v,u); int x=finde(u); int y=finde(v); if(x!=y) f[y]=x; } int ans=0; for(int i=1;i<=n;i++) { if(used[i]==0&&f[i]==i) { dfs(i); ans+=max(dp[i][0],dp[i][1]); used[i]=1; } } printf("Case %d: %d\n",cas,ans); } return 0; }
相关文章推荐
- ipv6地址的分类(关于FE80开头的IPV6地址等的介绍
- Json与Xml比较
- html5 图片热点area,map的用法
- different between unicorn / unicorn_rails
- different between unicorn / unicorn_rails
- 二级导航样式
- Safari5及以下版本不支持Date的横杠字符串格式
- 超漂亮的Bootstrap 富文本编辑器summernote
- play with bootstrap and less
- jquery $(document).ready() 与window.onload的区别
- HTML简单表单
- 使用CSS3设计地图上的雷达定位提示效果
- JS限制用户只能输入数字,用正则表达式
- JSP页面间传值问题实例简析
- js获取url参数值的两种方式
- jquery-validation 使用
- 手机web——自适应网页设计(html/css控制)
- bootstrap 练习
- 使用JavaScript
- 考验你的JavaScript底细