标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。