Codeforces Round #503 (by SIS, Div. 2) E. Sergey's problem
E. Sergey's problem
【题目描述】
给出一个n个点m条边的有向图,需要找到一个集合使得1、集合中的各点之间无无边相连2、集合外的点到集合内的点的最小距离小于等于2。
【算法】
官方题解证明的很强。对任意一个点 a(未访问过)删去其所有子节点,若剩余点组成的新图的答案集合不存在到 a 的边,则将 a 加入答案集合中;否则 删去a。一遍正向对 1~n 的每一个点遍历,保留父节点打上标记 -1,子节点打上标记 1。下一步就是删去不满足条件的点,对任意一个标有 -1 的点 i,首先应该找到剩余点的答案集合(即从 i+1 到 n 的所有满足条件的点),于是我们可以考虑从 n ~ 1 逆向遍历,这样即可满足条件。
给出一个反例(不太会用graphviz,逃。。。。):

如果正向删的话,只留下了e点显然gg。
【代码】
#include <bits/stdc++.h>
#define N 1000100
using namespace std;
int n,m,a,b,ans;
int v[N];
vector<int> head[N];
inline int read() {
    int x=0,f=1; char c=getchar();
    while(c<'0'||c>'9') { if(c=='-') f=-1; c=getchar(); }
    while(c>='0'&&c<='9') { x=x*10+c-'0'; c=getchar(); }
    return x*f;
}
int main() {
    n=read(),m=read();
    for(int i=1;i<=m;i++) a=read(),b=read(),head[a].push_back(b);
    for(int i=1;i<=n;i++) {
        if(v[i]) continue;
        int sz=head[i].size();
        v[i]=-1;
        for(int j=0;j<sz;j++) {
            if(v[head[i][j]]) continue;
            v[head[i][j]]=1;
        }
    }
    for(int i=n;i>=1;i--) {
        if(v[i]==1) continue;
        ans++;
        int sz=head[i].size();
        for(int j=0;j<sz;j++)
            v[head[i][j]]=1;
    }
    cout<<ans<<endl;
    for(int i=1;i<=n;i++)
        if(v[i]==-1) cout<<i<<" ";
    return 0;
}
Codeforces Round #503 (by SIS, Div. 2) E. Sergey's problem的更多相关文章
- Codeforces Round #503 (by SIS, Div. 2)  Solution
		从这里开始 题目列表 瞎扯 Problem A New Building for SIS Problem B Badge Problem C Elections Problem D The hat P ... 
- Codeforces Round #503 (by SIS, Div. 2)
		连接:http://codeforces.com/contest/1020 C.Elections 题型:你们说水题就水题吧...我没有做出来...get到了新的思路,不虚.好像还有用三分做的? KN ... 
- Codeforces Round #503 (by SIS, Div. 2) C. Elections (暴力+贪心)
		[题目描述] Elections are coming. You know the number of voters and the number of parties — n and m respe ... 
- Codeforces Round #503 (by SIS, Div. 2)-C. Elections
		枚举每个获胜的可能的票数+按照花费排序 #include<iostream> #include<stdio.h> #include<string.h> #inclu ... 
- Codeforces Round #503 (by SIS, Div. 1)E. Raining season
		题意:给一棵树每条边有a,b两个值,给你一个m,表示从0到m-1,假设当前为i,那么每条边的权值是a*i+b,求该树任意两点的最大权值 题解:首先我们需要维护出(a,b)的凸壳,对于每个i在上面三分即 ... 
- Codeforces Round #503 (by SIS, Div. 2) D. The hat
		有图可以直观发现,如果一开始的pair(1,1+n/2)和pair(x, x+n/2)大小关系不同 那么中间必然存在一个答案 简单总结就是大小关系不同,中间就有答案 所以就可以使用二分 #includ ... 
- Codeforces Round #503 (by SIS, Div. 2)B  1020B Badge  (拓扑)
		题目大意:每个同学可以指定一个人,然后构成一个有向图.1-n次查询,从某个人开始并放入一个东西,然后循环,直到碰到一个人已经放过了,就输出. 思路:直接模拟就可以了,O(n^2) 但是O(n)也可以实 ... 
- Codeforces Round #503 (by SIS, Div. 2) C. Elections(枚举,暴力)
		原文地址 C. Elections time limit per test 2 seconds memory limit per test 256 megabytes input standard i ... 
- Codeforces Round #503 (by SIS, Div. 2) D. The hat -交互题,二分
		cf1020D 题意: 交互题目,在有限的询问中找到一个x,使得数列中的第x位和第(x+n/2)位的值大小相同.数列保证相邻的两个差值为1或-1: 思路: 构造函数f(x) = a[x] - a[x ... 
随机推荐
- AOP 相关包
			aop 命名空间,jar 扫路径 
- 私有ip地址知多少?
			1.私有ip的由来 在现在的网络中,ip地址分为公网ip地址和私有ip地址.公网ip是在Internet中使用的ip地址,而私有ip地址是在局域网中使用,在Internet上不使用. 由于我们目前使用 ... 
- NOIP2018 D1T3赛道修建
			题目链接:Click here Solution: 最小值最大,考虑二分一个答案\(k\) 考虑在子树内先匹配,最后传递一个值给自己的父亲(因为每条边只能用一次,所以一颗子树最多传递一个值) 那么我们 ... 
- 【BZOJ3894】 文理分科
			Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行 描述,每个格子代表一个同学的座位. ... 
- sh_10_嵌套打印小星星
			sh_10_嵌套打印小星星 # 需求 # # 在控制台连续输出五行 *,每一行星号的数量依次递增 # * # ** # *** # **** # ***** # 开发步骤 # # 1> 完成 5 ... 
- SQL的积累
			SQL的积累学习(不常用的经常会忘记,所以以后用到的就会记在下面): --新增字段alter table t_Student add Test varchar(200)--删除字段alter tabl ... 
- 简单实现骨架屏 (Skeleton Screens)
			近年,国内外各大网站都引入骨架屏(Skeleton Screens)技术来提高用户体验.相比于之前的Loading动画,骨架屏页面更容易让用户产生一种错觉,页面快加载完了.骨架屏实现原理很 ... 
- vue根据参数不同的路由跳转以及name的作用
			最近在做VUE路由跳转根据参数的值不同但是跳转的是同一个路由的功能.点击左边的目录,根据目录ID跳转不同的列表.如下图. 路由跳转的代码: this.$router.push({path: '/RFI ... 
- 第三周syh
			第三周作业 7-1 判断上三角矩阵 (15 分) 上三角矩阵指主对角线以下的元素都为0的矩阵:主对角线为从矩阵的左上角至右下角的连线. 本题要求编写程序,判断一个给定的方阵是否上三角矩阵. 输入格 ... 
- 关闭layer.open打开的页面
			window.parent.location.reload(); //刷新父页面 var index = parent.layer.getFrameIndex(window.name); //获取窗口 ... 
