点击打开题目

题目大意:给定一棵无根树,点亮其中某些点,使得这棵树的所有边都连接着一个以上的点亮的点

贪心中比较有挑战的题

由于如果点亮叶节点,就只会照亮一条边,但点亮它的父亲,就可以照亮除此边以外的更多的边,所以,可先将所有叶节点的父亲点亮

其余的点,则通过后序遍历来访问,如果它的所有儿子都点亮了,那它就不用点亮,反之则点亮它,最后在搜索出所有点亮的点的数量即可

代码如下:

#include <cstdio>
#include<cmath>
#include <cstring>
#include <algorithm>
using namespace std;
int fir[3001],nxt[3001],to[3001],cnt;
bool vis[1501],lt[1501];
int getint()
{
int num=0,flag=1;char c;
while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;
while(c>='0'&&c<='9')num=num*10+c-48,c=getchar();
return num*flag;
}
void newnote(int u,int v){to[++cnt]=v,nxt[cnt]=fir[u],fir[u]=cnt;}
int n,ans;
void dfs(int x)
{
int i;
for(i=fir[x];i;i=nxt[i])
if(!vis[to[i]])
{
vis[to[i]]=1;
dfs(to[i]);
if(!lt[to[i]])lt[x]=1;
}
}
int main()
{
int i,j,x,y;
while(scanf("%d",&n)==1)
{
ans=cnt=0;
memset(fir,0,sizeof fir);memset(to,0,sizeof to);memset(nxt,0,sizeof nxt);
memset(vis,0,sizeof vis);memset(lt,0,sizeof lt);
for(i=1;i<=n;i++)
{
x=getint()+1;j=getint();
while(j--)y=getint()+1,newnote(x,y),newnote(y,x);
}
dfs(1);
for(i=1;i<=n;i++)if(lt[i])ans++;
printf("%d\n",ans);
}
}

如果没有yy到这种方法,树形DP也可以

dp[root][0]为没有点亮,dp[root][1]为点亮

状态转移方程如下:

dp[root][0]+=dp[son[root][i]][1];

dp[root][1]+=min(dp[son[root][i]][0],dp[son[root][i]][1]);

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[1501][2],son[1500][1500],fa[1501];
int min(int x,int y){return x<y?x:y;}
int getint()
{
char c;int flag=1,num=0;
while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;
while(c>='0'&&c<='9'){num=num*10+c-48;c=getchar();}
return num*=flag;
}
void work(int root)
{
int i;
for(i=1;i<=son[root][0];i++)
{
work(son[root][i]);
dp[root][0]+=dp[son[root][i]][1];
dp[root][1]+=min(dp[son[root][i]][0],dp[son[root][i]][1]);
}
dp[root][1]++;
}
int n;
int main()
{
int i,j,x,y,z;
n=getint();
for(i=1;i<=n;i++)
{
x=getint(),x++,y=getint();
for(j=1;j<=y;j++)
{
z=getint(),z++;
son[x][++son[x][0]]=z;
fa[z]=x;
}
}
for(i=1;i<=n;i++)
if(!fa[i])
{
work(i);
printf("%d",min(dp[i][0],dp[i][1]));
}
}

DP也yy不到?看二分图匹配能不能救你

代码如下:

#include <cstdio>
#include<cmath>
#include <cstring>
#include <algorithm>
using namespace std;
int fir[3001],nxt[3001],to[3001],cnt;
bool vis[1501],vy[3001];
int linky[3001],X[1501],g;
int getint()
{
int num=0,flag=1;char c;
while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;
while(c>='0'&&c<='9')num=num*10+c-48,c=getchar();
return num*flag;
}
void newnote(int u,int v){to[++cnt]=v,nxt[cnt]=fir[u],fir[u]=cnt;}
int n,ans;
void dfs(int u,int deep)
{
int i;
if(deep&1)X[++g]=u;
for(i=fir[u];i;i=nxt[i])
if(!vis[to[i]])
{
vis[to[i]]=1;
dfs(to[i],deep+1);
}
}
bool xyl(int x)
{
int i;
for(i=fir[x];i;i=nxt[i])
if(!vy[to[i]])
{
vy[to[i]]=1;
if(!linky[to[i]]||xyl(linky[to[i]]))
{
linky[to[i]]=x;return 1;
}
}
return 0;
}
int main()
{
int i,j,x,y;
while(scanf("%d",&n)==1)
{
ans=cnt=g=0;
memset(fir,0,sizeof fir);memset(to,0,sizeof to);memset(nxt,0,sizeof nxt);
memset(vis,0,sizeof vis);memset(linky,0,sizeof linky);
for(i=1;i<=n;i++)
{
x=getint()+1;j=getint();
while(j--)y=getint()+1,newnote(x,y),newnote(y,x);
}
vis[1]=1;dfs(1,1);
for(i=1;i<=g;i++)
{
memset(vy,0,sizeof vy);
ans+=xyl(X[i]);
}
printf("%d\n",ans);
}
}

一题多解——Strategic Game的更多相关文章

  1. SQLServer 常见SQL笔试题之语句操作题详解

    SqlServer 常见SQL笔试题之语句操作题详解 by:授客 QQ:1033553122 测试数据库 CREATE DATABASE handWriting ON PRIMARY ( name = ...

  2. 牛客网 Java 工程师能力评估 20 题 - 详解

    牛客网 Java 工程师能力评估 20 题 - 详解 不知在看博客的你是否知道 牛客网,不知道就太落后了,分享给你 : 牛客网 此 20 题,绝对不只是 20 题! 免责声明:本博客为学习笔记,如有侵 ...

  3. 关于SQL的几道小题详解

    关于SQL的几道小题详解 当我们拿到题目的时候,并不是急于作答,那样会得不偿失的,而是分析思路,采用什么方法,达到什么目的,还要思考有没有简单的方法或者通用的方法等等,这样才会达到以一当十的效果,这样 ...

  4. 一题多解,ASP.NET Core应用启动初始化的N种方案[上篇]

    ASP.NET Core应用本质上就是一个由中间件构成的管道,承载系统将应用承载于一个托管进程中运行起来,其核心任务就是将这个管道构建起来.在ASP.NET Core的发展历史上先后出现了三种应用承载 ...

  5. 一题多解,ASP.NET Core应用启动初始化的N种方案[下篇]

    [接上篇]"天下大势,分久必合,合久必分",ASP.NET应用通过GenericWebHostService这个承载服务被整合到基于IHostBuilder/IHost的服务承载系 ...

  6. HDU 5122 K.Bro Sorting(模拟——思维题详解)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5122 Problem Description Matt's friend K.Bro is an A ...

  7. 近期遇到的计(算)算(法)题及解(JavaScript)

    以下是近期遇到的三个计(算)算(法)题... 提到这些问题的时候简单理了下思路,后面又以JavaScript代码实现并顺便记个笔记... 至于是什么场景下遇到这些题的么... :) 问题一:从无序数组 ...

  8. Shooting Contest 射击比赛 [POJ1719] [CEOI1997] [一题多解]

    Description(下有中文题意) Welcome to the Annual Byteland Shooting Contest. Each competitor will shoot to a ...

  9. Longest Palindromic Substring - 一题多解

    题意是寻找一个字符串的最大回文字串,最简单的是n3方的算法,由于字符串最大长度为1000,所以这个方法很危险而且不科学. 紧接着想到的是一个n方的算法:回文子串是从中间向两边产生的,那么对于每个字符考 ...

随机推荐

  1. Linux 内核注册一个 USB 驱动

    所有 USB 驱动必须创建的主要结构是 struct usb_driver. 这个结构必须被 USB 驱动填 充并且包含多个函数回调和变量, 来向 USB 核心代码描述 USB 驱动: struct ...

  2. 路由器OpenWrt如何脱机(离线)下载BT文件

    路由器OpenWrt如何脱机(离线)下载BT文件 1.首先到如下网址下载OpenWrt固件(确保为路由器正确型号). http://downloads.openwrt.org/snapshots/tr ...

  3. sql临时表与变量表

    1)临时表存储在 tempdb 中,当不再使用时会自动删除 一般使用如下: --创建临时表 select * into #temp from TABLE --使用临时表 select * from # ...

  4. HBase写过程详解

    1首次读写流程图 2 首次写基本流程 (1)客户端发起PUT请求,Zookeeper返回hbase:meta所在的region server (2)去(1)返回的server上,根据rowkey去hb ...

  5. Python上下文管理使用

    import contextlib from queue import Queue @contextlib.contextmanager def myOpen(file): f = open(file ...

  6. Spring||Mails

    JMail可以解决Java发送邮件,通过Jmail的核心javax.mail.jar实现,通过Jmail发送邮件需要经过以下步骤 1.创建解析邮件内容:Message类,通过javax.mail.in ...

  7. 017 Ceph的集群管理_3

    一.验证OSD 1.1 osd状态 运行状态有:up,in,out,down 正常状态的OSD为up且in 当OSD故障时,守护进程offline,在5分钟内,集群仍会将其标记为up和in,这是为了防 ...

  8. 公子奇带你一步一步了解Java8中行为参数化

    说明:因为本公子一直从事监狱软件开发,所以本系列博客的引入也以此为背景.问题做了简化,只是为了来讲解技术点. 一.问题提出 今日在好好的撸着代码,超哥(民警)找来了,让把监狱30岁以上的民警找给他. ...

  9. 清晰架构(Clean Architecture)的Go微服务: 日志管理

    良好的日志记录可以提供丰富的日志数据,便于在调试时发现问题,从而大大提高编码效率. 记录器提供的自动化信息越多越好,日志信息也需要以简洁的方式呈现,便于找到重要的数据. 日志需求: 无需修改业务代码即 ...

  10. 洛谷$P4884$ 多少个1? 数论

    正解:$BSGS$ 解题报告: 传送门$QwQ$ 首先看到这个若干个一,发现不好表示,考虑两遍同时乘九加一,于是变成$10^n\equiv 9\cdot K+1(mod\ m)$ 昂然后不就是$bsg ...