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. ...
随机推荐
- 【mmall】IDEA插件jrebel
破解方法 http://www.jianshu.com/p/87b11bad3d7f
- java.lang.Enum
参考博客链接 java枚举类型的优势在哪里? Java 枚举(enum) 详解7种常见的用法
- Aizu - 2200 Mr. Rito Post Office
题意:/*你是某个岛国(ACM-ICPC Japan)上的一个苦逼程序员,你有一个当邮递员的好基友利腾桑遇到麻烦了:全岛有一些镇子通过水路和旱路相连,走水路必须要用船,在X处下船了船就停在X处.而且岛 ...
- nginx proxy_set_header设置、自定义header
先来看下proxy_set_header的语法 语法: proxy_set_header field value; 默认值: proxy_set_header Host $proxy_host; pr ...
- $Django RESTful规范
一 什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角度 ...
- python操作三大主流数据库(14)python操作redis之新闻项目实战②新闻数据的展示及修改、删除操作
python操作三大主流数据库(14)python操作redis之新闻项目实战②新闻数据的展示及修改.删除操作 项目目录: ├── flask_redis_news.py ├── forms.py ├ ...
- hue的历史查询记录querys乱码问题解决
hue的历史查询记录querys乱码问题解决: master1中配置文件/home/hadoop/.versions/hue-3.10.0/desktop/conf/hue.ini 可以看到连接的是m ...
- OpenStack实践系列①openstack简介及基础环境部署
OpenStack实践系列①openstack简介及基础环境部署 一.OpenStack初探1.1 OpenStack简介 OpenStack是一整套开源软件项目的综合,它允许企业或服务提供者建立.运 ...
- 阿里服务器配置swap
说明:阿里服务器安装系统之后,默认swap为0 .该篇是阿里服务器上配置swap 的过程记录: 1.进入目录 cd /var/ 2.获取要增加的SWAP文件块(这里以1GB为例,count = 102 ...
- python学习第16天。
内置函数是在原本已经有的序列的基础上,再生成新的. List的方是修改原列表. 内置函数中大部分函数的返回值大部分都是迭代器.生成器. Sorted需要遍历操作,不是单纯的迭代,所以不生成迭代器. 一 ...