题意

找出一个集合 \(Q\),使得其中的点两两之间没有连边,且集合中的点可以走不超过两步到达其他所有不在集合中的点。输出任意一组解。

\(n\leq 10^6\)

分析

  • 考虑构造,先从 \(1\) 到 \(n\) 枚举是否存在一个点 \(u\) 还没有被标记过,如果没有就用 \(u\) 去标记能够走到的点,同时将 \(u\) 加入 \(Q\)。

    容易证明这样的构造方式能够保证条件2:如果 \(u\) 的入度为 0 那么一定会加入 \(Q\) ,否则如果不在 \(Q\) 中就一定有一个能够到 \(u\) 的点在 \(Q\) 中。

  • 但是顺次枚举就有可能使得“相邻编号大的点能到编号小的点,两个点都在 \(Q\) 中” 这种情况,所以考虑如果出现了这样两个点,我们将编号较大的点保留,能够保证 \(Q\) 中的点在两步以内到达所有点。

  • 总时间复杂度为 \(O(n)\)。

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define go(u) for(int i = head[u], v = e[i].to; i; i=e[i].lst, v=e[i].to)
#define rep(i, a, b) for(int i = a; i <= b; ++i)
#define pb push_back
inline int gi() {
int x = 0,f = 1;
char ch = getchar();
while(!isdigit(ch)) {
if(ch == '-') f = -1;
ch = getchar();
}
while(isdigit(ch)) {
x = (x << 3) + (x << 1) + ch - 48;
ch = getchar();
}
return x * f;
}
template <typename T> inline void Max(T &a, T b){if(a < b) a = b;}
template <typename T> inline void Min(T &a, T b){if(a > b) a = b;}
const int N = 1e6 + 7;
int n, m, edc, ans;
int vis[N], mark[N], head[N];
struct edge {
int lst, to;
edge(){}edge(int lst, int to):lst(lst), to(to){}
}e[N*2];
void Add(int a, int b) {
e[++edc] = edge(head[a], b), head[a]=edc;
}
vector<int> res;
int main(){
n = gi(), m = gi();
rep(i, 1, m) {
int x = gi(), y = gi();
Add(x, y);
}
rep(u, 1, n) if(!vis[u]){
mark[u] = vis[u] = 1;
go(u) vis[v] = 1;
}
for(int u = n; u; --u) if(mark[u]){
++ans;
go(u) mark[v] = 0;
}
for(int u = 1; u <= n; ++u) if(mark[u]) res.pb(u);
printf("%d\n", ans);
for(int i = 0; i < res.size(); ++i) {
printf("%d%c",res[i],i == res.size() - 1 ? '\n' : ' ');
}
return 0;
}

[CF1019C]Sergey's problem[构造]的更多相关文章

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

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

  2. Codeforces 1019C Sergey's problem 构造

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

  3. Codeforces Round #503 (by SIS, Div. 2) E. Sergey's problem

    E. Sergey's problem [题目描述] 给出一个n个点m条边的有向图,需要找到一个集合使得1.集合中的各点之间无无边相连2.集合外的点到集合内的点的最小距离小于等于2. [算法] 官方题 ...

  4. 【Cf #503 C】Sergey's problem(有趣的构造)

    感觉这种构造题好妙啊,可我就是想不到诶. 给出一张无自环的有向图,回答一个独立集,使得图中任意一点都可以被独立集中的某一点两步之内走到. 具体构造方案如下: 下标从小到大枚举点,如果该点没有任何标记, ...

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

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

  6. Sergey's problem CodeForces - 1019C (图论,构造,神题)

    链接 大意: 给定有向图, 求选择一个点集$S$, 使得$S$任意两点不相连, 且对于不属于$S$的任意点$x$, 均存在$S$中的点$y$, 使得$d(x,y)<=2$, $d(x,y)$为从 ...

  7. HDU 5402 Travelling Salesman Problem (构造)(好题)

    大致题意:n*m的非负数矩阵,从(1,1) 仅仅能向四面走,一直走到(n,m)为终点.路径的权就是数的和.输出一条权值最大的路径方案 思路:因为这是非负数,要是有负数就是神题了,要是n,m中有一个是奇 ...

  8. 【CF1174D】 Ehab and the Expected XOR Problem - 构造

    题面 Given two integers \(n\) and \(x\), construct an array that satisfies the following conditions: · ...

  9. hdu 1757 A Simple Math Problem (构造矩阵解决递推式问题)

    题意:有一个递推式f(x) 当 x < 10    f(x) = x.当 x >= 10  f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + ...

随机推荐

  1. Java语法基础(四)----循环结构语句

    一.循环结构: 循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则 ...

  2. mysql的又一个让人捉摸不透的bug?

    这次就不说很多没有写博客了,因为前几天已经写过了.\^o^/ 昨天我们刚讨论了关于自动化运维工作的实现方式,如果批量执行,中间出错怎么办?突然有人提出mysql支持--force,可以跳过出错继续执行 ...

  3. c#List数组移除元素

    ; i >= ; i--) //移除已经订阅的患者 { if (AllPatientsEntities[i].姓名 == item.患者姓名) AllPatientsEntities.Remov ...

  4. 使用 Visual Studio Team Services 和 IIS 创建持续集成管道

    若要将应用程序开发的生成.测试和部署阶段自动化,可以使用持续集成和部署 (CI/CD) 管道. 本教程介绍如何在 Azure 中使用 Visual Studio Team Services 和 Win ...

  5. Sql server在使用sp_executesql @sql执行文本sql时,报错: Could not find database ID 16, name '16'. The database may be offline. Wait a few minutes and try again.

    最近在公司项目中使用exec sp_executesql @sql执行一段文本sql的时候老是报错: Could not find database ID 16, name '16'. The dat ...

  6. MySQL应用架构优化-实时数据处理

    1.1. 场景 在和开发人员做优化的时候,讨论最多的应该是结合应用场景编写出合适的SQL.并培训开发应该如何编写SQL让MySQL的性能尽量好.但是有一些的场景对于SQL的优化是行不通的. 打个比方, ...

  7. MySQL binlog group commit--commit stage

    说明: 1.process_commit_stage_queue:调用调用ha_commit_low->innobase_commit进入innodb层依次提交 2. process_after ...

  8. Java中几种常用数据类型之间转换的方法

    Java中几种常用的数据类型之间转换方法: 1. short-->int 转换 exp: short shortvar=0; int intvar=0; shortvar= (short) in ...

  9. Linux每日小技巧---ss命令

    ss命令 ss是Socket Statistics的缩写.顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容.但ss的优势在于它能够显示更多更详细的有关TCP和连 ...

  10. 一、 JSP概述 二、JSP的语法结构 三、JSP内置对象

    一.JSP概述###<1>概念 java服务器页面 可以编写动态页面 其内部是以HTML标签为主,可以在HTML标签嵌套java代码 jsp文件以.jsp为后缀 jsp本质上就是一个Ser ...