一题多解——Strategic Game
题目大意:给定一棵无根树,点亮其中某些点,使得这棵树的所有边都连接着一个以上的点亮的点
贪心中比较有挑战的题
由于如果点亮叶节点,就只会照亮一条边,但点亮它的父亲,就可以照亮除此边以外的更多的边,所以,可先将所有叶节点的父亲点亮
其余的点,则通过后序遍历来访问,如果它的所有儿子都点亮了,那它就不用点亮,反之则点亮它,最后在搜索出所有点亮的点的数量即可
代码如下:
#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的更多相关文章
- SQLServer 常见SQL笔试题之语句操作题详解
SqlServer 常见SQL笔试题之语句操作题详解 by:授客 QQ:1033553122 测试数据库 CREATE DATABASE handWriting ON PRIMARY ( name = ...
- 牛客网 Java 工程师能力评估 20 题 - 详解
牛客网 Java 工程师能力评估 20 题 - 详解 不知在看博客的你是否知道 牛客网,不知道就太落后了,分享给你 : 牛客网 此 20 题,绝对不只是 20 题! 免责声明:本博客为学习笔记,如有侵 ...
- 关于SQL的几道小题详解
关于SQL的几道小题详解 当我们拿到题目的时候,并不是急于作答,那样会得不偿失的,而是分析思路,采用什么方法,达到什么目的,还要思考有没有简单的方法或者通用的方法等等,这样才会达到以一当十的效果,这样 ...
- 一题多解,ASP.NET Core应用启动初始化的N种方案[上篇]
ASP.NET Core应用本质上就是一个由中间件构成的管道,承载系统将应用承载于一个托管进程中运行起来,其核心任务就是将这个管道构建起来.在ASP.NET Core的发展历史上先后出现了三种应用承载 ...
- 一题多解,ASP.NET Core应用启动初始化的N种方案[下篇]
[接上篇]"天下大势,分久必合,合久必分",ASP.NET应用通过GenericWebHostService这个承载服务被整合到基于IHostBuilder/IHost的服务承载系 ...
- HDU 5122 K.Bro Sorting(模拟——思维题详解)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5122 Problem Description Matt's friend K.Bro is an A ...
- 近期遇到的计(算)算(法)题及解(JavaScript)
以下是近期遇到的三个计(算)算(法)题... 提到这些问题的时候简单理了下思路,后面又以JavaScript代码实现并顺便记个笔记... 至于是什么场景下遇到这些题的么... :) 问题一:从无序数组 ...
- Shooting Contest 射击比赛 [POJ1719] [CEOI1997] [一题多解]
Description(下有中文题意) Welcome to the Annual Byteland Shooting Contest. Each competitor will shoot to a ...
- Longest Palindromic Substring - 一题多解
题意是寻找一个字符串的最大回文字串,最简单的是n3方的算法,由于字符串最大长度为1000,所以这个方法很危险而且不科学. 紧接着想到的是一个n方的算法:回文子串是从中间向两边产生的,那么对于每个字符考 ...
随机推荐
- Java虚拟机参数,增加虚拟机最大内存,在/etc/profile增加如下: export JAVA_OPTS="-Xms9g -Xmx9g"
一.运行class文件 执行带main方法的class文件,Java虚拟机命令参数行为: java <CLASS文件名> 注意:CLASS文件名不要带文件后缀.class 例如: java ...
- js算法(2)
1寻找一个数组中最多的那个数 (1)利用数组 function findMostNum(arr){ var temp1=[];//存放去重的数字 var temp2=[];//存放各个数字的个数 va ...
- VIM 用正则表达式,非贪婪匹配,匹配竖杠,竖线, 匹配中文,中文正则,倒数第二列, 匹配任意一个字符 :
VIM 用正则表达式 批量替换文本,多行删除,复制,移动 在VIM中 用正则表达式 批量替换文本,多行删除,复制,移动 :n1,n2 m n3 移动n1-n2行(包括n1,n2)到n3行之下: ...
- 闲着没事,做个chrome浏览器插件,适合初学者
时光偷走的,永远都是我们眼皮底下看不见的珍贵. 本插件功能:替换掉网页中的指定图片的src地址. 使用插件前: 使用插件后: 鲜花(闲话):这个网站的不加水印的图片连接被保存在,图片的data-ima ...
- boostrap-非常好用但是容易让人忽略的地方【4】:Font Awesome
font-awesome基本用法 官方代码传送门 font-awesome在bootstrap中的特殊用法(这个才是重点) 要点归纳1(官方) 官方代码传送门 要点归纳2(我的) <a href ...
- jdbc链接Oracle数据库的封装
在src下创建properties文件 driver=oracle.jdbc.driver.OracleDriverurl=jdbc:oracle:thin:@//127.0.0.1:1521/XEu ...
- ELK学习实验011:Logstash工作原理
Logstash事件处理管道包括三个阶段:输入→过滤器→输出.输入会生成事件,过滤器会对其进行修改,输出会将它们发送到其他地方.输入和输出支持编解码器,使您可以在数据进入或退出管道时对其进行编码或解码 ...
- [白话解析] 深入浅出一致性Hash原理
[白话解析] 深入浅出一致性Hash原理 0x00 摘要 一致性哈希算法是分布式系统中常用的算法.但相信很多朋友都是知其然而不知其所以然.本文将尽量使用易懂的方式介绍一致性哈希原理,并且通过具体应用场 ...
- Windows Live Writer 语法高亮
1.WindowsLiveWriter.CNBlogs.CodeHighlighter.rar 这个插件生成的高亮代码与网页上的一模一样,插入后即可立即显示效果,不过貌似它必须联网才能实时显示效果,因 ...
- C / C++ 保留小数函数(setprecision(n)的一些用法总结)
从C语言开始正式学习C++,但是一上来输出位数就懵了,查资料才知道C++需要使用 “ setprecision ”函数.自己总结一下. 首先说C++代码 #include <iomanip&g ...