题面

题意

给出一张有向图,要求在其中选取一个点集,要求:
1.点集中的任意两个点之间都没有边。
2.任何在点集之外的点与点集内的点的最短距离不大于2。

做法

首先正着遍历所有点,如果这个点还没有标记则标记为1,将它能一步到达的且标记为0的点全部标记为-1,表示这些点不能选择,然后倒着遍历一遍,将标记为1的计入答案,并将其能一步到达的点的标记全部改为-1。
可以发现正着遍历之后可能会导致存在a->b,且a,b同时被标记为1,且b < a,这样倒着遍历就可以保证先将a(拓扑序较小的点)计入答案,保证了任何点都可以由所选点集中的点到达,而且不难发现距离不会超过2.

代码

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<queue>
#define P pair<int,int>
#define mp make_pair
#define fi first
#define se second
#define N 1001000
using namespace std;int n,m,first[N],ds[N],bb,bj[N];
bool ok[N];
struct Bn
{int to,next;
} bn[N<<1];
vector<int>ans;inline void add(int u,int v)
{bb++;bn[bb].to=v;bn[bb].next=first[u];first[u]=bb;
}int main()
{memset(first,-1,sizeof(first));int i,j,o,p,q,t;cin>>n>>m;for(i=1; i<=m; i++){scanf("%d%d",&p,&q);add(p,q);}for(i=1; i<=n; i++){if(bj[i]) continue;bj[i]=1;for(p=first[i];p!=-1;p=bn[p].next){if(!bj[bn[p].to]){bj[bn[p].to]=-1;}}}for(i=n;i>=1;i--){if(bj[i]!=1 || ok[i]) continue;ans.push_back(i);for(p=first[i];p!=-1;p=bn[p].next){bj[bn[p].to]=-1;}}cout<<ans.size()<<endl;for(i=0;i<ans.size();i++) printf("%d ",ans[i]);
}

codeforces 1019C Sergey's problem相关推荐

  1. Codeforces 776D The Door Problem

    题目链接:http://codeforces.com/contest/776/problem/D 把每一个钥匙拆成两个点${x,x+m}$,分别表示选不选这把钥匙. 我们知道一扇门一定对应了两把钥匙. ...

  2. codeforces C. Sonya and Problem Wihtout a Legend(dp or 思维)

    题目链接:http://codeforces.com/contest/713/problem/C 题解:这题也算是挺经典的题目了,这里附上3种解法优化程度层层递进,还有这里a[i]-i<=a[i ...

  3. 【CodeForces - 706C】Hard problem(dp,字典序)

    题干: Vasiliy is fond of solving different tasks. Today he found one he wasn't able to solve himself, ...

  4. Codeforces 1000D Yet Another Problem On a Subsequence 动态规划

    D. Yet Another Problem On a Subsequence time limit per test 2 seconds memory limit per test 256 mega ...

  5. CodeForces - 1000D Yet Another Problem On a Subsequence(动态规划+组合数学)

    题目链接:点击查看 题目大意:给出n个数字组成的序列,现在规定"好数组"指的是一个连续序列a1,a2,...ak的a1=k-1,再规定"好序列"是可以分为若干个 ...

  6. 【CodeForces - 1096D】Easy Problem(dp,思维)

    题目大意: 现在有一个由小写字母组成的字符串,去掉这个字符串的第i个位置的字符会有ai的代价.你的任务是去掉这个字符串中的一些字符使得该字符串中不包含子序列hard,且去掉字符的代价之和尽可能小. 输 ...

  7. 【Codeforces 1096D】Easy Problem

    [链接] 我是链接,点我呀:) [题意] 让你将一个字符串删掉一些字符. 使得字符串中不包含子序列"hard" 删掉每个字符的代价已知为ai 让你求出代价最小的方法. [题解] 设 ...

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

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

  9. CodeForces - 986E Prince's Problem

    Description 给一棵树,每个点有点权 \(a_i\) ,每次给 \(u,v,x\) ,求 \(u\) 到 \(v\) 路径上每个点的点权与 \(x\) 的 \(gcd\) 的积. \(n,m ...

  10. CodeForces 464E The Classic Problem | 呆克斯歘 主席树维护高精度

    题意描述 有一个\(n\)点\(m\)边的无向图,第\(i\)条边的边权是\(2^{a_i}\).求点\(s\)到点\(t\)的最短路长度(对\(10^9 + 7\)取模). 题解 思路很简单--用主 ...

最新文章

  1. MySQL索引相关的数据结构和算法
  2. 【uni-app】H5中使用videojs播放器播放视频
  3. Proxy(代理)--对象结构型模式
  4. java 开发人员工具_Java开发人员应该知道的5种错误跟踪工具
  5. linux来源usb驱动在哪下载,Linux USB驱动程序基础
  6. 人机交互,加速机器人拟人化
  7. 三星w2014android,三星W2014评测:机身细节及内部设计
  8. 1424 零树 (树形DP)
  9. 即刻起,加速您的前端构建
  10. python一键清屏_在python中将代码清屏的方法
  11. 风云2号卫星云图_中国为什么要发这么多卫星?答案没有出乎意料
  12. c语言 大写字母转换为小写字母后的第五个,将大写字母转换为对应小写字母之后的第5字母;若小写字母为v~z,使小写字母的值减21。...
  13. 编写WPF应用程序实现以下功能:定义一个RandomHelp类,该类提供一个静态的GetIntRandomNumber方法,一个静态的GetDoubleRandomNumber方法。
  14. solidity 关键字constant/view/pure/payable的区别
  15. 华为鲲鹏云主机编译安装MySQL 8.0.17
  16. 北京首都国际机场1号航站楼、2号航站楼、3号航站楼航空公司名单
  17. 创立仅一年GMV突破3亿!这个新锐品牌如何在快手实现爆发?
  18. 如何用gitbook写书
  19. 湖南卫视全部节目主持人名单
  20. SAPMM没有收货就可以预制发票或可以预制大于收货数量的发票

热门文章

  1. 如何自学Android编程
  2. 缓存穿透、并发和失效、同步中断,最佳实践及优化方案
  3. visual Studio2019和pcl1.10.1安装及实验(无图、不详细)
  4. TCP/IP 和 HTTP不了解?看完这篇文章,网络知识就全懂了
  5. python 数字爆炸 number boom 小程序
  6. 安装opencv3.4.15时发现的“-Werror=address”问题
  7. python不允许标点符号_Python处理中文标点符号大集合
  8. 深度学习教程(16) | Seq2seq序列模型和注意力机制(吴恩达·完整版)
  9. 【附源码】Java计算机毕业设计校园闲置物品租赁系统(程序+LW+部署)
  10. 08_ue4进阶末日生存游戏开发[导入动画和骨骼]