CF1019C
好玄学的东西...
核心思想:for循环!
首先,我们从前向后扫所有的点,如果这个点没被标记成不可用就把这个点标记成已使用,然后把所有与这个点直接相连的点标记成不可用
接下来,我们从后向前扫所有的点,如果这个点被标记成已使用就把与这个点所有直接相连的也被标记已使用的点达成不能使用,最后标记成可使用的就是集合中的点
证明一下这个算法的正确性:
首先,经过第一步操作后,第二个要求一定能够满足,因为现在集合中的点和集合外的点的距离至多是1!(如果这个点不在集合里,说明这个点一定已经被一个在集合里的点标记上了,所以集合里的点到集合外的点的距离最大是1)
可是这样做会产生一些不合法的情况,这些情况的产生原因是我们在进行第一步操作时,只能够排除由编号较小的点向编号较大的点连边的情况,但是如果有编号较大的点向编号较小的点连边这种情况是无法处理的
所以我们第二次再从后向前扫点,将与扫到的所有计划使用的点有连边的点标记为不可用,这样就能保证集合中的点互相没有连边了
至于这么做是否能满足距离的要求,我们思考:经过第一步操作后,我们能保证的是所有集合外的点与集合内的点距离为1
那么我们删除一个集合内的点的条件这个点与集合中别的点有连边,也就是说如果这个点被删掉了,这个点与集合的距离就会变成1,那么最糟的情况无非就是另一个集合外的点只与这个点相连,这样的情况的话外面的点到集合的距离无非就是2,所以也是合法的,也就是说,这样操作后获得的情况一定是一种合法情况!
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
struct Edge
{
int next;
int to;
}edge[];
int head[];
bool used[];
bool vis[];
int cnt=;
int n,m;
void init()
{
memset(head,-,sizeof(head));
cnt=;
}
void add(int l,int r)
{
edge[cnt].next=head[l];
edge[cnt].to=r;
head[l]=cnt++;
} int main()
{
scanf("%d%d",&n,&m);
init();
for(int i=;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
}
for(int i=;i<=n;i++)
{
if(!used[i])
{
vis[i]=;
used[i]=;
for(int j=head[i];j!=-;j=edge[j].next)
{
int to=edge[j].to;
used[to]=;
}
}
}
for(int i=n;i>=;i--)
{
if(vis[i])
{
for(int j=head[i];j!=-;j=edge[j].next)
{
int to=edge[j].to;
vis[to]=;
}
}
}
int ret=;
for(int i=;i<=n;i++)
{
if(vis[i])
{
ret++;
}
}
printf("%d\n",ret);
for(int i=;i<=n;i++)
{
if(vis[i])
{
printf("%d ",i);
}
}
return ;
}
CF1019C的更多相关文章
- [CF1019C]Sergey's problem[构造]
题意 找出一个集合 \(Q\),使得其中的点两两之间没有连边,且集合中的点可以走不超过两步到达其他所有不在集合中的点.输出任意一组解. \(n\leq 10^6\) 分析 考虑构造,先从 \(1\) ...
- CF1019C Sergey's problem (图上构造)
题目大意:给你一个有向连通图,让你找出一个点集,保证点集内的点之间没有直接连边,且集合中存在一点,到一个 非点集中的点的距离小于等于2 思路很清奇 首先编号从小到大遍历每个点,如果这个点没有被访问过, ...
- Codeforces 1019C Sergey's problem 构造
原文链接https://www.cnblogs.com/zhouzhendong/p/CF1019C.html 题目传送门 - CF1019C 题意 给定一个有 $n$ 个节点 . $m$ 条边的有向 ...
- 【CF1020E】Sergey's problem(构造)
题意: 思路:这是一道论文题 https://link.springer.com/content/pdf/10.1007/BFb0066192.pdf From http://www.cnblogs. ...
随机推荐
- MySQL - COUNT关键字
基础数据信息 SELECT COUNT(*) AS '用户名的个数' FROM t_user SELECT COUNT(DISTINCT username) AS '用户名不重复的个数' FROM t ...
- Akka Quickstart with Java-笔记
官方文档: http://developer.lightbend.com/guides/akka-quickstart-java/?_ga=2.177525157.1012573474.1504767 ...
- 【VMware vSphere】vCenter添加主机失败:无法访问指定主机
背景 前一段时间,给一台服务器安装ESXi系统,安装成功之后,通过vCenter在上面安装了一台VDP系统.结果前几天发现服务器掉线,重新连接时出现问题.问题描述如下: 其中错误堆栈具体内容为:在 v ...
- 数字图像处理的Matlab实现(4)—灰度变换与空间滤波
第3章 灰度变换与空间滤波(2) 3.3 直方图处理与函数绘图 基于从图像亮度直方图中提取的信息的亮度变换函数,在诸如增强.压缩.分割.描述等方面的图像处理中扮演着基础性的角色.本节的重点在于获取.绘 ...
- Learning Invariant Deep Representation for NIR-VIS Face Recognition
查找异质图像匹配的过程中,发现几篇某组的论文,都是关于NIR-VIS的识别问题,提到了许多处理异质图像的处理方法,网络结构和idea都很不错,记录其中一篇. 其余两篇: Wasserstein CNN ...
- Linker Scripts3--SECTIONS Command
1.前言 SECTIONS命令告诉链接器如何映射输入段到输出段以及在内存中如何放置输出段,SECTIONS命令的格式如下: SECTIONS { sections-command sections-c ...
- Windows PowerShell 入門(9)-エラー編
対象読者 Windows PowerShellでコマンドレット操作ができる方 何らかのプログラミング経験があればなお良い 必要環境 Windows PowerShell エラーをリダイレクトする リダ ...
- spring集成cxf实现webservice接口功能
由于cxf的web项目已经集成了Spring,所以cxf的服务类都是在spring的配置文件中完成的.以下是步骤:第一步:建立一个web项目.第二步:准备所有jar包.将cxf_home\lib项目下 ...
- modsign: could't get uefi db list
手头上一个工控机,装完 ubuntu 16.04后重启, 一直提示如下错误: modsign: could't get uefi db list 用过ubuntu的修复工具也没有成功. 后经过如下操 ...
- ubuntu安装 opencv-3.4.3
1 .官网(https://opencv.org/releases.html)下载下源码 opencv-3.4.3.zip 2.解压 unzip opencv-3.4.3.zip 3.cmake c ...