Strategic game POJ - 1463 树型dp
//题意:就是你需要派最少的士兵来巡查每一条边。相当于求最少点覆盖,用最少的点将所有边都覆盖掉
//题解:
//因为这是一棵树,所以对于每一条边的两个端点,肯定要至少有一个点需要放入士兵,那么对于x->y这一条边
//dp[x][0]=0 表示在x这一点上不放人士兵
//dp[x][1]=1 表示在x这一个点上放入士兵
//那么就有
//dp[x][0]+=dp[y][1];
//dp[x][1]+=min(dp[y][0],dp[y][1]);
//注意这一道题不需要建立一个图,然后再去dfs,因为题目上就是按树从根到叶逐渐给出的。所以可以直接存
//belong用来表示每一个点的层数,pre表示它的父亲节点
第一次我是建了一个图去找dp,然后就MLE了
1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<algorithm>
5 using namespace std;
6 const int maxn=1500;
7 struct edge
8 {
9 int v,next;
10 }e[maxn];
11 int cnt,head[maxn],dp[maxn][5];
12 void add_edge(int x,int y)
13 {
14 e[cnt].v=y;
15 e[cnt].next=head[x];
16 head[x]=cnt++;
17 }
18 int n;
19 void dfs(int x,int pre)
20 {
21 dp[x][0]=0;
22 dp[x][1]=1;
23 for(int i=head[x];i!=-1;i=e[i].next)
24 {
25 int to=e[i].v;
26 //printf("%d %d\n",x,to);
27 if(to==pre)
28 {
29 //printf("**%d**%d\n",x,to);
30 continue;
31 }
32 dfs(to,x);
33 dp[x][0]+=dp[to][1];
34 dp[x][1]+=min(dp[to][1],dp[to][0]);
35 }
36 }
37 int main()
38 {
39 while(~scanf("%d",&n))
40 {
41 memset(head,-1,sizeof(head));
42 cnt=0;
43 memset(dp,0,sizeof(dp));
44 int x,y,sum,u,flag=0;
45 for(int i=1;i<=n;++i)
46 {
47 scanf("%d:(%d)",&x,&sum);
48
49 x++;
50 if(flag==0)
51 {
52 flag=1;
53 u=x;
54 }
55 while(sum--)
56 {
57 scanf("%d",&y);
58 y++;
59 add_edge(x,y);
60 add_edge(y,x);
61 }
62 }
63 //printf("%d**\n",u);
64 dfs(u,u);
65 printf("%d\n",min(dp[u][0],dp[u][1]));
66 }
67 return 0;
68 }
正解:
1 //题意:就是你需要派最少的士兵来巡查每一条边。相当于求最少点覆盖,用最少的点将所有边都覆盖掉
2 //题解:
3 //因为这是一棵树,所以对于每一条边的两个端点,肯定要至少有一个点需要放入士兵,那么对于x->y这一条边
4 //dp[x][0]=0 表示在x这一点上不放人士兵
5 //dp[x][1]=1 表示在x这一个点上放入士兵
6 //那么就有
7 //dp[x][0]+=dp[y][1];
8 //dp[x][1]+=min(dp[y][0],dp[y][1]);
9
10 //注意这一道题不需要建立一个图,然后再去dfs,因为题目上就是按树从根到叶逐渐给出的。所以可以直接存
11 //belong用来表示每一个点的层数,pre表示它的父亲节点
12 #include<stdio.h>
13 #include<string.h>
14 #include<iostream>
15 #include<algorithm>
16 using namespace std;
17 const int maxn=1505;
18 int belong[maxn],pre[maxn],dp[maxn][5],cnt;
19 int n;
20 void DP(int x,int index)
21 {
22 dp[x][0]=0;
23 dp[x][1]=1;
24 for(int i=1;i<=n;++i)
25 {
26 if(pre[i]==x)
27 {
28 DP(i,index+1);
29 dp[x][0]+=dp[i][1];
30 dp[x][1]+=min(dp[i][0],dp[i][1]);
31 }
32 }
33 }
34 int main()
35 {
36 while(~scanf("%d",&n))
37 {
38 memset(pre,0,sizeof(pre));
39 memset(dp,0,sizeof(dp));
40 memset(belong,0,sizeof(belong));
41 cnt=0;
42 int x,y,sum,u,flag=0;
43 for(int i=1;i<=n;++i)
44 {
45 scanf("%d:(%d)",&x,&sum);
46 x++;
47 belong[x]=++cnt;
48 if(flag==0)
49 {
50 flag=1;
51 u=x;
52 }
53 cnt++;
54 while(sum--)
55 {
56 scanf("%d",&y);
57 y++;
58 pre[y]=x;
59 // add_edge(x,y);
60 // add_edge(y,x);
61 belong[y]=cnt;
62 }
63 }
64 pre[u]=-1;
65 DP(u,1);
66 printf("%d\n",min(dp[u][0],dp[u][1]));
67 }
68 return 0;
69 }
Strategic game POJ - 1463 树型dp的更多相关文章
- poj 2378 树型dp
和poj1655那道求树的重心基本上一样的,代码也没多大改动. 详情请见 #include<cstdio> #include<algorithm> #include<cs ...
- 树形dp compare E - Cell Phone Network POJ - 3659 B - Strategic game POJ - 1463
B - Strategic game POJ - 1463 题目大意:给你一棵树,让你放最少的东西来覆盖所有的边 这个题目之前写过,就是一个简单的树形dp的板题,因为这个每一个节点都需要挺好处 ...
- 【POJ 3140】 Contestants Division(树型dp)
id=3140">[POJ 3140] Contestants Division(树型dp) Time Limit: 2000MS Memory Limit: 65536K Tot ...
- 【POJ 2486】 Apple Tree(树型dp)
[POJ 2486] Apple Tree(树型dp) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8981 Acce ...
- POJ 3342 - Party at Hali-Bula 树型DP+最优解唯一性判断
好久没写树型dp了...以前都是先找到叶子节点.用队列维护来做的...这次学着vector动态数组+DFS回朔的方法..感觉思路更加的清晰... 关于题目的第一问...能邀请到的最多人数..so ea ...
- HDU_1520_Anniversary party_树型dp
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 Anniversary party Time Limit: 2000/1000 MS (Java ...
- POJ3659 Cell Phone Network(树上最小支配集:树型DP)
题目求一棵树的最小支配数. 支配集,即把图的点分成两个集合,所有非支配集内的点都和支配集内的某一点相邻. 听说即使是二分图,最小支配集的求解也是还没多项式算法的.而树上求最小支配集树型DP就OK了. ...
- 【XSY1905】【XSY2761】新访问计划 二分 树型DP
题目描述 给你一棵树,你要从\(1\)号点出发,经过这棵树的每条边至少一次,最后回到\(1\)号点,经过一条边要花费\(w_i\)的时间. 你还可以乘车,从一个点取另一个点,需要花费\(c\)的时间. ...
- 洛谷P3354 Riv河流 [IOI2005] 树型dp
正解:树型dp 解题报告: 传送门! 简要题意:有棵树,每个节点有个权值w,要求选k个节点,最大化∑dis*w,其中如果某个节点到根的路径上选了别的节点,dis指的是到达那个节点的距离 首先这个一看就 ...
随机推荐
- redis之集群一:主从
Redis的三种集群模式 Redis有三种集群模式,第一个就是主从模式,第二种"哨兵"模式,第三种是Cluster集群模式,第三种的集群模式是在Redis 3.x以后的版本才增加进 ...
- /usr/local/mysql/bin/mysqlbinlog -vv /var/lib/bin/mysql-bin.000008 --base64-output=DECODE-ROWS --start-pos=307
/usr/local/mysql/bin/mysqlbinlog -vv /var/lib/bin/mysql-bin.000008 --base64-output=DECODE-ROWS --st ...
- mysql中的kill
show processlist;查看id, 然后 kill id ; 就行了.
- Empire
Empire 内网渗透神器 一 基本渗透 安装 git clone https://github.com/BC-SECURITY/Empire/ ./setup/install.sh 启动 ./emp ...
- EXPORT和IMPORT使用示例
1 report ztestprog. 2 data:begin of itab1 occurs 0, 3 ff(10), 4 end of itab1. 5 data:itab2 like itab ...
- Java基础复习4
选择排序(擂台排序): public class demo1 { public static void main(String[] args) { // TODO Auto- ...
- ASP Net Core – CORS 预检请求
CORS(跨源资源共享)是一种机制,它允许同一个来源运行的Web应用程序从在另一个来源运行的服务器访问资源.同源策略是一种非常严格的措施,因为它只允许与服务器起源于同一源的应用程序访问其资源.很多时候 ...
- GlusterFS分布式存储系统复制集更换故障Brick操作记录
场景: GlusterFS 3节点的复制集,由于磁盘故障,其中一个复制集需要重装系统,所以需要重装glusterfs并将该节点加入glusterfs集群 一. 安装GlusterFS 首先在重装系统节 ...
- mail Header Injection Exploit
Preventing Email Header Injection - PHundamental PHP Best Practices - http://nyphp.org/phundamentals ...
- 翻页bug 在接口文档中应规范参数的取值区间 接口规范
<?php$a=array("red","green","blue","yellow","brown&q ...