Codeforces 1019C Sergey's problem 构造
原文链接https://www.cnblogs.com/zhouzhendong/p/CF1019C.html
题目传送门 - CF1019C
题意
给定一个有 $n$ 个节点 、 $m$ 条边的有向图,没有自环,但是可能存在环。
现在要求选出一个点集满足一下条件。
设原来的所有点构成的点集为 $V$ ,选出的点集为 $S$,则:
1. 对于所有满足 $x,y\in S$ 的点 $x,y$ ,有向边 $(x,y)$ 不存在。
2. 对于所有满足 $y\in V$ 的点,都可以找到一个点 $x(x\in S)$,满足从点 $x$ 开始走到 $y$ 的最少经过边数不超过 2 。
首先输出你选出的点数,然后按照编号从小到大输出你选的点。
$n,m\leq 10^6$
题解
我们考虑以下构造方案:
1. 记当前的图为 $G(V,E)$ 。
2. 选择一个节点 $A\in V$ ,从 $G$ 中删除节点 $A$ ,以及从 $A$ 出发的有向边连向的所有节点,得到新图 $G^\prime$ 。
3. 如果 $V^\prime \neq \emptyset $ ,则返回第 1. 步。否则到第 4 步。
4. 记之前选出的所有节点 $A$ 构成的集合为 $v$ ,取 $v$ 和 原图 $G$ 中只与 $v$ 中的点有关边集 $e$ ,构成新图 $g(v,e)$ 。容易得知,$g$ 是一个有向无环图。
5. 记当前的图为 $g(v,e)$ 。
6. 取一个入度为 $0$ 的节点 $a$ ,并将该节点加入答案集合 $S$,删除 $a$ 以及在 $g$ 中 $a$ 能一步走到的所有点。设得到的新图的点集为 $v^\prime$ 。
7. 如果 $v^\prime \neq \emptyset$ ,则返回第 1. 步。否则输出答案集合 $S$ 。
现在简单的说明一下这样做的正确性:
① 首先,显然任意两个属于答案集合点不能一步到达。
② 对于任意满足 $x\in v,x\notin S$ 的节点 $x$ ,它只可能在第 6 步被删除,那么,显然有一个能一步达到 $x$ 的节点被记入答案。
③ 对于任意满足 $x\in V,x\notin v$ 的节点 $x$ ,它只可能在第 2 步的时候被删除,那么,显然有一个能一步到达 $x$ 的节点 $y$ 在集合 $v$ 中。又根据 ② ,如果 $y\notin S$ ,有一步到 $y$ 的节点,则 $x$ 可以花两步到达;否则,$y\in S$ ,$x$ 可以由 $y$ 一步到达。
④ 由于属于答案集合的节点显然可以在 2 步以内到达,再根据 ②③ ,上述做法的正确性显然。
接下来就只差一个方便的实现方法了,详见代码。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1000005;
int read(){
int x=0;
char ch=getchar();
while (!isdigit(ch))
ch=getchar();
while (isdigit(ch))
x=(x<<1)+(x<<3)+ch-48,ch=getchar();
return x;
}
void write(int v){
int k=v/10;
if (v>9)
write(k);
putchar('0'+(v-k*10));
}
struct Gragh{
static const int M=1000005;
int cnt,y[M],nxt[M],fst[N];
void clear(){
cnt=0;
memset(fst,0,sizeof fst);
}
void add(int a,int b){
y[++cnt]=b,nxt[cnt]=fst[a],fst[a]=cnt;
}
}g;
int n,m;
int vis[N],ans[N],anscnt=0;
int main(){
n=read(),m=read();
g.clear();
for (int i=1;i<=m;i++){
int a=read(),b=read();
g.add(a,b);
}
for (int i=1;i<=n;i++)
if (!vis[i]){
vis[i]=-2;
for (int j=g.fst[i];j;j=g.nxt[j])
vis[g.y[j]]=min(vis[g.y[j]],-1);
}
for (int i=n;i>=1;i--)
if (vis[i]==-2){
ans[++anscnt]=i;
for (int j=g.fst[i];j;j=g.nxt[j])
vis[g.y[j]]=-1;
}
write(anscnt),puts("");
for (int i=anscnt;i>=1;i--)
write(ans[i]),putchar(' ');
return 0;
}
Codeforces 1019C Sergey's problem 构造的更多相关文章
- [CF1019C]Sergey's problem[构造]
题意 找出一个集合 \(Q\),使得其中的点两两之间没有连边,且集合中的点可以走不超过两步到达其他所有不在集合中的点.输出任意一组解. \(n\leq 10^6\) 分析 考虑构造,先从 \(1\) ...
- 1019C Sergey's problem(思维)
题意: 找出来一个点集S 使得S中的点不能互相通过一步到达 并且S中的点 可以在小于等于2的步数下到达所有的点 要父结点 不要子结点 这样就求出来一个点集S‘ 而S'中可能存在 v -> u ...
- Codeforces Round #503 (by SIS, Div. 2) E. Sergey's problem
E. Sergey's problem [题目描述] 给出一个n个点m条边的有向图,需要找到一个集合使得1.集合中的各点之间无无边相连2.集合外的点到集合内的点的最小距离小于等于2. [算法] 官方题 ...
- Educational Codeforces Round 10 B. z-sort 构造
B. z-sort 题目连接: http://www.codeforces.com/contest/652/problem/B Description A student of z-school fo ...
- Codeforces 707C Pythagorean Triples(构造三条边都为整数的直角三角形)
题目链接:http://codeforces.com/contest/707/problem/C 题目大意:给你一条边,问你能否构造一个包含这条边的直角三角形且该直角三角形三条边都为整数,能则输出另外 ...
- Codeforces 1246D/1225F Tree Factory (构造)
题目链接 https://codeforces.com/contest/1246/problem/D 题解 首先考虑答案的下界是\(n-1-dep\) (\(dep\)为树的深度,即任何点到根的最大边 ...
- Codeforces - 1202D - Print a 1337-string... - 构造
https://codeforces.com/contest/1202/problem/D 当时想的构造是中间两个3,然后前后的1和7组合出n,问题就是n假如是有一个比较大的质数因子或者它本身就是质数 ...
- [codeforces 528]B. Clique Problem
[codeforces 528]B. Clique Problem 试题描述 The clique problem is one of the most well-known NP-complete ...
- codeforces.com/contest/325/problem/B
http://codeforces.com/contest/325/problem/B B. Stadium and Games time limit per test 1 second memory ...
随机推荐
- svn:Item ‘XXXXXX’ is out of date
问题描述: 工作副本没有更新到最新版本 svn: 提交失败(细节如下): svn: 目录 "D:\develop\workspace\gxcjx\src\main\resources ...
- REST风格接口测试利器Wisdom rest-client
前言 偶然间接触到Wisdom rest-client这款测试工具,后来经过尝试体验,感觉还不错,现在分享给大家,如何使用这款测试利器 Wisdom rest-client是什么? Wisdom re ...
- Linux学习之CentOS(二)--初识linux的一些常用命令
Linux学习之CentOS(二)--初识linux的一些常用命令 在VM上安装完了CentOS6.4以后,看着linux系统成功跑起来,心里小激动了一把......但是前方学习的道路还很遥远... ...
- Java希尔排序算法
希尔排序就是对直接插入排序的一个优化.比如有这么一种情况:对一个无序数组进行从小到大的排序,但是数组的最后一个位置的数是最小的,我们要把它挪到第一个位置,其他位置的都要往后移动,要是这个数组非常大,那 ...
- 转:vw适配中使用伪类选择器遇到的问题
地址:https://blog.csdn.net/perryliu6/article/details/80965734 在使用vue init webpack构建的项目中,一开始我准备使用rem布局, ...
- react轮播图----react-slick
1.安装 npm install react-slick; //安装样式 npm install slick carousel; 再在App.css中引入 @import "~slick-c ...
- 尚硅谷《全套Java、Android、HTML5前端视频》
尚硅谷<全套Java.Android.HTML5前端视频> (百万谷粉推荐:史上最牛.最适合自学的全套视频.资料及源码) [尚硅谷官网资料导航] 谷粒学院在线学习:http://www.g ...
- Confluence 6 通过 SSL 或 HTTPS 运行 - 创建或请求一个 SSL 证书
在启用 HTTPS 之前,你需要一个有效的证书,如果你已经有了一个有效的证书,你可以直接跳过这个步骤,进入 step 2. 你可以创建一个自签名的证书,或者从信任的 Certificate Autho ...
- Confluence 6 重新获得附件指南
每一个文件在恢复上传到 Confluence 的时候必须单独重命名,你可以通过下面说明的 3 个方法中选择一个进行操作: 选择 A - 通过文件名恢复附件 如果你知道你需要恢复的每一个文件名,尤其是你 ...
- 【shell】两种字符串提取场景的实现
shell虽然比batch顺眼点儿,但还是老话,入门容易,精通难. 1.场景一是这样的,现有字符串的内容 name: tiger; age:18; location:china; 需求:提取每个属性的 ...