题目分析:

  首先观察可知这是一个无向图,那么我们构建出它的dfs树。由于无向图的性质我们可以知道它的dfs树只有返祖边。考虑下面这样一个结论。

  结论:若一个点的子树中(包含自己)有两个点有到它祖先的返祖边(不包括到它自己),

  首先我们证明S和T肯定在DFS树中是祖先关系,接着证明到T至少有一条返祖边,那么这个结论就是显然的了。

代码:

 #include<bits/stdc++.h>
using namespace std; const int maxn = ; int n,m;
vector <int>g[maxn]; int up[maxn],dep[maxn],wh[maxn],fa[maxn];
int flag, from, to; void read(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) g[i].clear();
for(int i=;i<=m;i++){
int u,v; scanf("%d%d",&u,&v);
g[u].push_back(v); g[v].push_back(u);
}
} int r1[maxn],num1;
int r2[maxn],num2;
int r3[maxn],num3;
int md;
stack <int> s;
void print(int now){
int pla = now;
while(dep[pla] != to) r1[++num1] = pla,pla = fa[pla];
r1[++num1] = pla; pla = md;
while(dep[pla] != dep[now]) s.push(pla),pla = fa[pla];
s.push(pla);
while(!s.empty()){r2[++num2] = s.top();s.pop();}
r2[++num2] = r1[num1]; pla = wh[now];
while(dep[pla] != dep[now]) s.push(pla),pla = fa[pla];
s.push(pla);
while(!s.empty()){r3[++num3] = s.top();s.pop();}
pla = r1[num1];
while(dep[pla] != up[now]) s.push(pla),pla = fa[pla];
s.push(pla);
while(!s.empty()){r3[++num3] = s.top();s.pop();} printf("%d %d\n",r1[],r1[num1]);
printf("%d ",num1);for(int i=;i<=num1;i++) printf("%d ",r1[i]);
puts("");
printf("%d ",num2);for(int i=;i<=num2;i++) printf("%d ",r2[i]);
puts("");
printf("%d ",num3);for(int i=;i<=num3;i++) printf("%d ",r3[i]);
puts("");flag = ;
} void dfs(int now,int dp){
dep[now] = dp;
for(int i=;i<g[now].size();i++){
int nxt = g[now][i];
if(fa[now] == nxt) continue;
if(flag) break;
if(dep[nxt] == ){
fa[nxt] = now;
dfs(nxt,dp+); if(flag) break;
if(up[nxt] >= dep[now]) continue;
if(up[now] >= ) up[now] = up[nxt],wh[now] = wh[nxt];
else{
if(up[now] <= up[nxt]){
from = now; to = up[nxt];md = wh[nxt];
}else {
from = now; to = up[now];up[now] = up[nxt];
md = wh[now];wh[now]= wh[nxt];
}
print(from);
}
}else{
if(dep[nxt] > dep[now]) continue;
if(up[now] >= ) up[now] = dep[nxt],wh[now] = now;
else{
if(up[now] <= dep[nxt]){
from = now; to = dep[nxt];md = now;
}else {
from = now; to = up[now];up[now] = dep[nxt];
md = wh[now];wh[now] = now;
}
print(from);
}
}
}
} void work(){
flag = ; from = ; to = ; num1 = num2 = num3 = ;
for(int i=;i<=n;i++) wh[i] = ,fa[i] = ,dep[i] = ,up[i] = 1e9;
for(int i=;i<=n;i++) if(!dep[i]) dfs(i,);
if(!flag){puts("-1");}
} int main(){
int cas; scanf("%d",&cas);
while(cas--){
read();
work();
}
return ;
}

BZOJ5203 [NEERC2017 Northern] Grand Test 【dfs树】【构造】的更多相关文章

  1. 7.9 NOI模拟赛 A.图 构造 dfs树 二分图

    啥都想不出来的我是不是废了/dk 这道题考的主要是构造 而我想的主要是乱搞. 一个很假很假的做法:直接暴力4种颜色染色 我也不知道对不对.. 不过成功的话一定是对的. 然后考虑奇环的问题 一个很假很假 ...

  2. dfs树

    dfs树是解决图中带环的利器. 前天CF的F题就是dfs树,但是当时我没有认真思考 觉着找到一个环过于困难 当时没有想到 也没理解dfs树的意义. 对于一张无向图求出一个dfs树 这个树有两种边 树边 ...

  3. zstu.4191: 无向图找环(dfs树 + 邻接表)

    4191: 无向图找环 Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 117  Solved: 34 Description 给你一副无向图,每条边有 ...

  4. C#在泛型类中,通过表达式树构造lambda表达式

    场景 最近对爬虫的数据库架构做调整,需要将数据迁移到MongoDB上去,需要重新实现一个针对MongoDB的Dao泛型类,好吧,动手开工,当实现删除操作的时候问题来了. 我们的删除操作定义如下:voi ...

  5. lintcode :前序遍历和中序遍历树构造二叉树

    解题 前序遍历和中序遍历树构造二叉树 根据前序遍历和中序遍历树构造二叉树. 样例 给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树: 2 / \ 1 3 注意 你可以假设树中不存 ...

  6. lintcode: 中序遍历和后序遍历树构造二叉树

    题目 中序遍历和后序遍历树构造二叉树 根据中序遍历和后序遍历树构造二叉树 样例 给出树的中序遍历: [1,2,3] 和后序遍历: [1,3,2] 返回如下的树: 2 /  \ 1    3 注意 你可 ...

  7. BZOJ_4238_电压_树上差分+dfs树

    BZOJ_4238_电压_树上差分+dfs树 Description 你知道Just Odd Inventions社吗?这个公司的业务是“只不过是奇妙的发明(Just Odd Inventions)” ...

  8. LOJ2250 [ZJOI2017] 仙人掌【树形DP】【DFS树】

    题目分析: 不难注意到仙人掌边可以删掉.在森林中考虑树形DP. 题目中说边不能重复,但我们可以在结束后没覆盖的边覆盖一个重复边,不改变方案数. 接着将所有的边接到当前点,然后每两个方案可以任意拼接.然 ...

  9. Codeforces962F Simple Cycles Edges 【双连通分量】【dfs树】

    题目大意: 给出一个无向图,问有哪些边只属于一个简单环. 题目分析: 如果这道题我们掌握了点双连通分量,那么结论会很显然,找到每个点双,如果一个n个点的点双正好由n条边构成,那么这些边都是可以的. 这 ...

随机推荐

  1. Omi教程-组件通讯攻略大全

    组件通讯 Omi框架组建间的通讯非常遍历灵活,因为有许多可选方案进行通讯: 通过在组件上声明 data-* 传递给子节点 通过在组件上声明 data 传递给子节点 (支持复杂数据类型的映射) 父容器设 ...

  2. 常见的web攻击手段总结

    xxs攻击(跨站脚本攻击) 攻击者在网页中嵌入恶意脚本程序,当用户打开该网页时脚本程序便在浏览器上执行,盗取客户端的cookie.用户名密码.下载执行病毒木马程 序 解决: 我们可以对用户输入的数据进 ...

  3. web网站css,js更新后客户浏览器缓存问题,需要刷新才能正常展示的解决办法

    问题描述 最近将公司官网样式进行了调整,部署到服务器后访问发现页面展示不正常,但是刷新之后就会展示正常. 问题分析 研究之后发现可能的原因有 css文件过大,加载缓慢 本地缓存问题,虽然服务器修改了c ...

  4. Redis集群搭建过程

    我在搭建Redis集群过程中遇到了一些问题,现记录下来. Redis搭建需要在系统中安装好ruby.gem.zlib等工具,可参考https://www.cnblogs.com/wuxl360/p/5 ...

  5. Django之admin中管理models中的表格

    Django之admin中管理models中的表格 django中使用admin管理models中的表格时,如何将表格注册到admin中呢? 具体操作就是在项目文件夹中的app文件夹中的admin中注 ...

  6. Python_程序实现发红包

    发红包 200块钱  20个红包 将200块随机分成20份 基础版本: import random ret = random.sample(range(1, 200 * 100), 19) ret = ...

  7. 使用 Drools 和 JPA & Drools show case in docker hub

    使用 Drools 和 JPA 实现持续的实时数据分析https://www.ibm.com/developerworks/cn/java/j-drools5/index.html Drools - ...

  8. Tomcat connecttimeout sessiontimeout

    IIS中的会话超时和连接超时之间有什么区别? | Adept Technologies Inc.https://www.adepttech.com/blog/?p=825 IIS中的会话超时和连接超时 ...

  9. 企业级分布式应用服务EDAS _Dubbo商业版_微服务PaaS平台 【EDAS Serverless 运维 创业】

    企业级分布式应用服务EDAS _Dubbo商业版_微服务PaaS平台_分布式框架 - 阿里云https://www.aliyun.com/product/edas?source_type=yqzb_e ...

  10. 上传图片(photoClip)

    首先我们需要引入4个js包(这4个包总共106.6KB) <script src="__STATIC__/hammer.min.js" ></script> ...