一题多解——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第七周
重要知识点 1.“super”的用法 构造器和方法,都用关键字super指向超类,但是用的方法不一样.方法用这个关键字去执行被重载的超类中的方法 2.接口和抽象类的异同 相同: 1.接口和抽象类都有抽 ...
- IDE介绍之——CLion
CLion是JetBrains公司旗下发布的一款跨平台C/C++IDE开发工具. 使用CLion上最好要会手写CMake.要先安装编译器套件(一般安装MinGW就行). 对C++标准的支持:基本上Cl ...
- LDO
1.出现原因:便携式设备的发展,使得人们对电源的要求越来越高,而以前一直使用的三段稳压电源无法满足需求. 2.特点:内部的PNP管导通压降很小,自耗很低. 3.应用场合: (1)不同电压输出级别的应用 ...
- 十二、格式化I/O
1.fprintf 表头文件 #include<stdio.h> 定义函数 int fprintf(FILE * stream, const char * format,.......); ...
- Delphi XE里的StrPas要注意哦(要让StrPas知道哪里是字符串结束)
废话不多说了,直接上例子解说: procedure TForm1.Button1Click(Sender: TObject);var aa: array[0..1]of AnsiChar; bb1 ...
- 掌握这些,ArrayList就不用担心了!
关于ArrayList的学习 ArrayList属于Java基础知识,面试中会经常问到,所以作为一个Java从业者,它是你不得不掌握的一个知识点.
- 调试排错 - Java问题排查:Linux命令
本文原创,更多内容可以参考: Java 全栈知识体系.如需转载请说明原处. Java 在线问题排查主要分两篇:本文是第一篇,通过linux常用命令排查.@pdai 文本操作 文本查找 - grep g ...
- linux入门系列2--CentOs图形界面操作及目录结构
上一篇文章"linux入门系列1--环境准备及linux安装"直观演示了虚拟机软件VMware和Centos操作系统的安装,按照文章一步一步操作,一定都可以安装成功.装好系统之后, ...
- notpad++使用cmd的快捷键设置
notepad++运行批处理的设置: 运行 --> 输入运行程序名"$(FULL_CURRENT_PATH)" --> 保存(自定义的快捷键即可运行)
- Go中的Package和Module分析
Package 所谓package(包)其实就是代码的一种组织管理方式,代码多了就需要放入文件,文件多了就需要归类放入文件夹,就好比我们在给电脑装软件时会进行归类安装,其实也是有意无意对电脑软件安装的 ...