ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CF1368E Ski Accidents

2021-08-23 14:04:25  阅读:215  来源: 互联网

标签:include 来自 int ll 入度 CF1368E 入边 Accidents Ski


读懂题是第一要素。

考虑把点集分割为:\(A,B,C\)

首先把所有入度为\(0\)的点加入\(A\)
然后对所有入边只来自\(A\)的点加入\(B\)
然后对所有入边只来自\(B\)的点加入\(C\)

剩下的全部加入\(C\)

此时:

A:只有入度为0的点,或者全部入边全来自C
B:只有来自A的入度
C:至少有来自B的入度

那么这要我们删掉C,即可保证没有三点是联通的。

由于每个点只有两个出度,所以我们可以证明,\(|C| \leq \frac{4}{7}n\)

#include<iostream>
#include<cstdio>
#include<vector>
#include<set>
#define ll long long 
#define N 200005

ll n,m;
ll t;
std::vector<ll>to[N];		
std::vector<int>ans;

int main(){
	scanf("%lld",&t);
	while(t -- ){
	ans.clear();
	scanf("%lld%lld",&n,&m);
	for(int i = 1;i <= n;++i)
	to[i].clear();
	for(int i = 1;i <= m;++i){
		ll x,y;
		scanf("%lld%lld",&x,&y);
		to[y].push_back(x);
	}
	std::vector<int>color(n);	
	for(int i = 1;i <= n;++i){
		for(int j = 0;j < to[i].size();++j){
			int u = to[i][j];
			if(color[u] == 1)
			color[i] = 2;
			if(color[i] != 2 && color[u] == 0)
			color[i] = 1;
		}
	}
	for(int i = 1;i <= n;++i)
	if(color[i] == 2)
	ans.push_back(i);
	std::cout<<ans.size()<<std::endl;
	for(int i = 0;i < ans.size();++i)
	std::cout<<ans[i]<<" ";	
	puts("");	
	}
}

标签:include,来自,int,ll,入度,CF1368E,入边,Accidents,Ski
来源: https://www.cnblogs.com/dixiao/p/15175529.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有