好玄学的东西...

核心思想: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的更多相关文章

  1. [CF1019C]Sergey's problem[构造]

    题意 找出一个集合 \(Q\),使得其中的点两两之间没有连边,且集合中的点可以走不超过两步到达其他所有不在集合中的点.输出任意一组解. \(n\leq 10^6\) 分析 考虑构造,先从 \(1\) ...

  2. CF1019C Sergey's problem (图上构造)

    题目大意:给你一个有向连通图,让你找出一个点集,保证点集内的点之间没有直接连边,且集合中存在一点,到一个 非点集中的点的距离小于等于2 思路很清奇 首先编号从小到大遍历每个点,如果这个点没有被访问过, ...

  3. Codeforces 1019C Sergey's problem 构造

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF1019C.html 题目传送门 - CF1019C 题意 给定一个有 $n$ 个节点 . $m$ 条边的有向 ...

  4. 【CF1020E】Sergey's problem(构造)

    题意: 思路:这是一道论文题 https://link.springer.com/content/pdf/10.1007/BFb0066192.pdf From http://www.cnblogs. ...

随机推荐

  1. Python API简单验证

    前言 因为CMDB内部的需求,需要一个API进行数据传输,用来传递需要抓取的服务端信息信息给抓取的autoclient,autoclient抓取好之后再通过API传输到服务器,保存到数据库.但是为了防 ...

  2. Handler的postDelayed的实现方法

    暂存,待归纳 https://www.jianshu.com/p/f5f710d55255 https://blog.csdn.net/qingtiantianqing/article/details ...

  3. scrapy基础 之 xpath网页结构

    1 ,什么是xpath XPath 是一门在 XML 文档中查找信息的语言.XML是一种类似于HTML的传输协议 2,节点 XPath 中,有七种类型的节点:元素.属性.文本.命名空间.处理指令.注释 ...

  4. srping mvc 集成CXF 导致类初始化两遍

    cxf依赖于spring的ContextLoaderListener,而spring mvc 则依赖于DispatcherServlet. 初始化DispatcherServlet的时候会依赖初始化一 ...

  5. CF1097F Alex and a TV Show

    题目地址:CF1097F Alex and a TV Show bitset+莫比乌斯反演(个人第一道莫比乌斯反演题) 由于只关心出现次数的奇偶性,显然用bitset最合适 但我们并不直接在bitse ...

  6. SpringSecurity项目中如何在多个模块中配置认证信息

    ⒈在SpringSecurity项目中创建AuthorizeConfigProvider接口用于配置认证信息 package cn.coreqi.ssoserver.authorize; import ...

  7. Memcache的安装和使用【转】

    转自:https://www.cnblogs.com/caoxiaojian/p/5715573.html Memcache是高性能,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问 ...

  8. layout 的应用

    在XAF的开发中,详细Detail 或组合DashBoard页面,需要使用 LayoutControl 进行控件排列,下面讲述如何通过写代码进行操作. 0.DevExpress 的布局控件(DevEx ...

  9. 使用html2canvas生成一张图片

    注意事项: 1.图片生成问题,生成图片测试机正常传到正式机,无法生成!!====>>原因是正式机中,使用的是CDN加载,导致图片跨域,而canvas不支持图片跨域!!!==>> ...

  10. liunx之Centos6.8杀毒软件的安装

    作者:邓聪聪 为了防止服务器中病毒,安装了类似与Windowns的杀毒软件Clanav,过程如下 首先下载clamav的软件包,官方下载地址为http://www.clamav.net/downloa ...