[cf1361E]James and the Chase
称一个点是"好点",当且仅当其到其余所有点恰存在一条简单路径
结论1:$x$为好点当且仅当以$x$为根的dfs树包含所有点且非树边均为返祖边
若不包含所有点,那么$x$到不被包含的点即不存在简单路径
若存在非树边不为返祖边,则不论如何该边$x$到该边终点存在至少两条简单路径
另一方面,考虑在这样一棵dfs树中的简单路径,将其用非树边划分为若干段(段的内部只能用树边),每一段树边构成一条链,则显然有以下性质:
1.链无公共点
2.第一条链链顶为起点,最后一条链链尾为终点
3.每一条链链尾存在到下一条链链顶的(返祖)边
4.每一条链链顶是上一条链链顶的祖先(其实是1和3的推论)
由此,考虑从$x$到$y$的简单路径,最后一条链链顶是$x$的祖先(4的推论),而该链链尾为$y$,因此$x$到$y$的简单路径数必然经过$lca(x,y)$
特别的,若$x$是$y$的祖先,那么为了不重复经过$x$,必然仅有一条链且恰为$x$到$y$
更特别的,当$x$是根时其是任意一点的祖先,因此到任意一点恰存在一条简单路径,即得证
根据此结论,即可$o(n)$判定一个好点
进一步的,不断随机一个点$x$并判断其是否是好点,若随机$T$次后仍找不到好点,那么好点数严格小于20%的概率即有$1-\frac{1}{5^{T}}$,当$T=100$时可以看作1,也即不需要输出
由此即可得到一个好点,将其记作$rt$,并以$rt$为根建立dfs树(以下均指此树)
称一条非树边"通过"$x$当且仅当其以$x$子树内(包括$x$)为起点且到达$x$的祖先
结论2:$x$为好点当且仅当$x=rt$或恰存在一条非树边通过$x$且该非树边的终点为好点
$x=rt$的情况显然,不妨假设$x\ne rt$
此时,如果不存在非树边通过$x$显然$x$无法到达$x$的祖先,如果存在多条非树边通过$x$则显然$x$到这两条非树边终点中较深的点存在至少两条简单路径,因此$x$均不为好点
而若该非树边的终点不为好点,对其分类讨论:
1.若其到某点不存在简单路径,注意到其可以到达$x$,那么$x$到该点一定也不存在简单路径
2.若其到某点存在至少两条简单路径,该点显然不在其子树中(结合结论1的证明),那么其一定不会再经过$x$(到达$x$子树内后要离开必须重复经过自己),也即$x$到其的这一段不会使得简单路径重复经过某点,那么$x$到该点也存在至少两条简单路径
另一方面,若该非树边的终点是好点,则对其余点分类讨论:
1.$x$到$x$子树内的点,同样根据结论1的证明恰存在一条简单路径
2.$x$到$x$子树外的点,必然要经过该好点且之后不会在经过$x$,在其简单路径的基础上补一段即可
由此,简单递归即可求出所有好点
时间复杂度为$o(Tn)$,可以通过

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 100005
4 #define T 100
5 vector<int>ans,v[N];
6 int t,n,m,rt,flag,x,y,dfn[N],cnt[N],pos[N],vis[N];
7 void dfs(int k){
8 dfn[k]=++dfn[0],vis[k]=1;
9 for(int i=0;i<v[k].size();i++)
10 if (!dfn[v[k][i]]){
11 dfs(v[k][i]);
12 if ((!pos[k])||(dfn[pos[v[k][i]]]<dfn[pos[k]]))pos[k]=pos[v[k][i]];
13 cnt[k]+=cnt[v[k][i]];
14 }
15 else{
16 if (!vis[v[k][i]])flag=1;
17 else{
18 if ((!pos[k])||(dfn[v[k][i]]<dfn[pos[k]]))pos[k]=v[k][i];
19 cnt[k]++,cnt[v[k][i]]--;
20 }
21 }
22 vis[k]=0;
23 }
24 void check(int k){
25 vis[k]=0;
26 if ((k==rt)||(cnt[k]==1)&&(vis[pos[k]]))vis[k]=1;
27 for(int i=0;i<v[k].size();i++)
28 if (dfn[k]<dfn[v[k][i]])check(v[k][i]);
29 }
30 int main(){
31 srand(time(0));
32 scanf("%d",&t);
33 while (t--){
34 scanf("%d%d",&n,&m);
35 ans.clear();
36 for(int i=1;i<=n;i++)v[i].clear();
37 for(int i=1;i<=m;i++){
38 scanf("%d%d",&x,&y);
39 v[x].push_back(y);
40 }
41 for(int k=0;k<T;k++){
42 rt=flag=dfn[0]=0;
43 for(int i=0;i<20;i++)rt=(rt<<1)+rand()%2;
44 rt=(rt+n-1)%n+1;
45 for(int i=1;i<=n;i++)dfn[i]=cnt[i]=pos[i]=vis[i]=0;
46 dfs(rt);
47 if ((dfn[0]!=n)||(flag))continue;
48 for(int i=1;i<=n;i++)vis[i]=0;
49 check(rt);
50 for(int i=1;i<=n;i++)
51 if (vis[i])ans.push_back(i);
52 break;
53 }
54 if (5*ans.size()<n)printf("-1\n");
55 else{
56 printf("%d",ans[0]);
57 for(int i=1;i<ans.size();i++)printf(" %d",ans[i]);
58 printf("\n");
59 }
60 }
61 return 0;
62 }
[cf1361E]James and the Chase的更多相关文章
- Solution -「CF 1361E」James and the Chase
\(\mathcal{Description}\) Link. 给定 \(n\) 个点 \(m\) 条边的有向弱连通图.称一个点是"好点"当且仅当从该点出发,不存在到同一点 ...
- JavaMail和James
JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API.它可以方便地执行一些常用的邮件传输.我们可以基于JavaMail开发出类似于Micr ...
- JavaMail和James的秘密花园
JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API.它可以方便地执行一些常用的邮件传输.我们可以基于JavaMail开发出类似于Micros ...
- 使用James搭建一个自己的邮箱服务器
---第一天开发--- 下载Apache James 3.0邮箱服务器,解压到响应的目录 可以看到目录结构: H:\code\JavaCode\James\apache-james-3.0-beta4 ...
- 【转载】James Whittaker:经营成功的测试职业生涯
转注:这篇文章出自 James A. Whittaker ,但未找到原始出处/译者.如果有知道原始出处的朋友,可在评论这留言. 你是如何开始做测试工作的? 1989年,我在田纳西大学读研究生的时候, ...
- 06-图2 Saving James Bond - Easy Version
题目来源:http://pta.patest.cn/pta/test/18/exam/4/question/625 This time let us consider the situation in ...
- Apache James搭建内网邮件服务器
Apache James搭建内网邮件服务器 极客521 | 极客521 2014-08-21 148 阅读 java 大概之前两个礼拜的日子,讨论会介绍了关于了.net内网邮件服务器的搭建.所以自己也 ...
- James搭建邮件服务器
来源:http://chenfengcn.iteye.com/blog/356874 1 关于James与Javamail Apache James(Java Apache Mail Enterp ...
- PTA 07-图5 Saving James Bond - Hard Version (30分)
07-图5 Saving James Bond - Hard Version (30分) This time let us consider the situation in the movie ...
随机推荐
- vue使用AES.js
AES加密的使用 对数据传输加密.解密处理---AES.js 第一步: 在vue中安装crypto-js依赖 npm install crypto-js --save-dev 第二步: 在static ...
- Go语言核心36讲(Go语言基础知识四)--学习笔记
04 | 程序实体的那些事儿(上) 还记得吗?Go 语言中的程序实体包括变量.常量.函数.结构体和接口. Go 语言是静态类型的编程语言,所以我们在声明变量或常量的时候,都需要指定它们的类型,或者给予 ...
- hdu3507 斜率优化学习笔记(斜率优化+dp)
QWQ菜的真实. 首先来看这个题. 很显然能得到一个朴素的\(dp\)柿子 \[dp[i]=max(dp[i],dp[j]+(sum[i]-sum[j])^2) \] 但是因为\(n\le 50000 ...
- Go语言核心36讲(Go语言进阶技术二)--学习笔记
08 | container包中的那些容器 我们在上次讨论了数组和切片,当我们提到数组的时候,往往会想起链表.那么 Go 语言的链表是什么样的呢? Go 语言的链表实现在标准库的container/l ...
- 初学python-day11 函数3
函数 1. global关键字 修改全局变量,声明函数内外使用同一个变量 示例: 1 name = 'xiaoming' 2 3 def test(): 4 global name 5 name = ...
- SPI在JDBC中的运用
前言 之前学习了JDK SPI的机制,本文专门讨论2个内容: 1.为什么在使用SPI后,不需要Class.forName()了? 2.SPI在JDBC中的运用. JDBC模板代码 private st ...
- better-scroll快速上手及封装(vue项目)
愿你有诗有梦,有坦荡荡的远方 本文声明:这是一篇学习coderwhy老师的vue2课程的一个笔记,所以本文章是在vue项目中实现,没学过vue的大佬们可以举一反三. 使用场景及介绍 BetterScr ...
- [对对子队]Beta阶段项目展示博客
Beta阶段项目展示博客 1 团队成员的简介和个人博客地址 成员 头像 岗位 博客 个人介绍 黄贤昊 PM 17373253 喜欢玩游戏和做游戏,项目经验基本都和游戏相关,擅长摸鱼,偶尔敬业. 吴桐雨 ...
- 面试不再慌,终于有人把TCP讲明白了。。。
前言 TCP(Transmission Control Protocol,传输控制协议) 是计算机网络的的重要组成部分,也是网络编程的重要内容,还有我们平时接触最多的 HTTP 也是基于 TCP 实现 ...
- spring security中动态更新用户的权限
在程序的执行过程中,有时有这么一种需求,需要动态的更新某些角色的权限或某些人对应的权限,当前在线的用户拥有这个角色或拥有这个权限时,在不退出系统的情况下,需要动态的改变的他所拥有的权限. 需求:张三 ...