HDU 3896 Greatest TC 双连通分量

题意

给一个连通的无向图,有两种询问:

  • \(a, b, c, d\),问如果删掉\(c,d\)之间的边,\(a,b\)之间是否还连通
  • \(a, b, c\),问如果删掉顶点\(c\)\(a,b\)之间是否还连通

分析

首先DFS一遍求出进入节点的时间戳\(pre(u)\),离开节点的时间戳\(post(u)\)以及当前节点的子树中能连接到的最小的DFS序\(low(u)\)
然后预处理一下\(u\)\(2^i\)级祖先,方便计算\(u\)的任意级祖先。

考虑第一种查询

不妨设\(c\)\(d\)的儿子节点,如果\(c,d\)之间是一个桥并且\(a,b\)两个节点一个在\(c\)的子树中一个不在,这种情况下是不连通的。
其他情况都是连通的。

考虑第二种查询

分成三种情况讨论:

  • \(a,b\)都在子树\(c\)中,如果\(a,b\)\(c\)的同一个儿子子树中那么去掉\(c\)是连通的。
    否则,让\(a,b\)往上跳,变成\(c\)的两个儿子。如果\(low(a) \geq pre(c)\)\(low(b) \geq pre(c)\)有一个成立,那么是不连通的。

  • \(a,b\)只有一个在子树\(c\)中,由于对称性,不妨假设\(a\)在子树\(c\)中。
    同样让\(a\)往上跳,变成\(c\)的儿子。如果\(low(a) \geq pre(c)\)那么不连通,否则连通。

  • \(a,b\)都不在子树\(c\)中,那么去掉\(c\)完全没有任何影响,所以还是连通的。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;const int maxn = 100000 + 10;
const int maxm = 1000000 + 10;struct Edge
{int v, nxt;Edge() {}Edge(int v, int nxt): v(v), nxt(nxt) {}
};int ecnt, head[maxn];
Edge edges[maxm];void AddEdge(int u, int v) {edges[ecnt] = Edge(v, head[u]); head[u] = ecnt++;edges[ecnt] = Edge(u, head[v]); head[v] = ecnt++;
}int n, m;int fa[maxn], dep[maxn];
int dfs_clock, pre[maxn], post[maxn], low[maxn];
bool isbridge[maxn], iscut[maxn];void dfs(int u) {bool flag = false;int child = 0;pre[u] = low[u] = ++dfs_clock;for(int i = head[u]; ~i; i = edges[i].nxt) {int v = edges[i].v;if(v == fa[u] && !flag) { flag = true; continue; }child++;if(!pre[v]) {fa[v] = u;dep[v] = dep[u] + 1;dfs(v);low[u] = min(low[u], low[v]);if(low[v] >= pre[u]) {iscut[u] = true;if(low[v] > pre[u]) isbridge[v] = true;}} else low[u] = min(low[u], pre[v]);}if(u == 1 && child == 1) iscut[u] = false;post[u] = dfs_clock;
}int anc[maxn][20];void preprocess() {memset(anc, 0, sizeof(anc));for(int i = 1; i <= n; i++) anc[i][0] = fa[i];for(int j = 1; (1 << j) < n; j++)for(int i = 1; i <= n; i++) if(anc[i][j-1])anc[i][j] = anc[anc[i][j-1]][j-1];
}int upward(int u, int x) {for(int i = 0; i < 20; i++)if((x >> i) & 1) u = anc[u][i];return u;
}int insubtree(int u, int v) {if(pre[v] <= pre[u] && pre[u] <= post[v]) return 1;return 0;
}bool juedgeVertex(int a, int b, int c) {int in1 = insubtree(a, c);int in2 = insubtree(b, c);if(in1 & in2) {a = upward(a, dep[a] - dep[c] - 1);b = upward(b, dep[b] - dep[c] - 1);if(a == b) return true;if(low[a] >= pre[c]) return false;if(low[b] >= pre[c]) return false;}if(in1 ^ in2) {if(!in1) swap(a, b);a = upward(a, dep[a] - dep[c] - 1);if(low[a] >= pre[c]) return false;}return true;
}int main()
{while(scanf("%d%d", &n, &m) == 2) {ecnt = 0;memset(head, -1, sizeof(head));while(m--) {int u, v;scanf("%d%d", &u, &v);AddEdge(u, v);}dfs_clock = 0;memset(pre, 0, sizeof(pre));memset(isbridge, false, sizeof(isbridge));memset(iscut, false, sizeof(iscut));dfs(1);preprocess();int q;scanf("%d", &q);while(q--) {int op, a, b, c, d;scanf("%d%d%d%d", &op, &a, &b, &c);bool ok = true;if(op == 1) {scanf("%d", &d);if(dep[c] < dep[d]) swap(c, d);int in1 = insubtree(a, c);int in2 = insubtree(b, c);if(isbridge[c] && (in1 ^ in2) == 1) ok = false;} else {ok = juedgeVertex(a, b, c);}printf("%s\n", ok ? "yes" : "no");}}return 0;
}

转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/5361919.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/490960.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 字符串指针和字符串指针数组详解

C处理字符串有两种方式&#xff0c;即&#xff1a;指针方式和数组方式 数组方式&#xff1a;char a[] "HelloWorld";指针方式&#xff1a;const char* s "HelloWorld"; const可以忽略 接下来详细讲解一下字符串指针 首先&#xff0c;为什么字符串可以…

工业机器人的控制方式

工业机器人的控制方式 工业机器人的控制方式目前市场上使用最多的机器人当属工业机器人&#xff0c;也是最成熟完善的一种机器人&#xff0c;而工业机器人能得到广泛应用&#xff0c;得益于它拥有有多种控制方式&#xff0c;按作业任务的不同&#xff0c;可主要分为点位控制方…

软银千亿美元愿景基金PPT,孙正义解读股权投资IRR=44%

来源&#xff1a;股权投资论坛&#xff08;PE821010&#xff09;综合“正和岛(zhenghedao)、皮卡丘财经、猎云网&#xff08;ilieyun&#xff09;、财立方&#xff08;icailifang&#xff09;、腾讯科技&#xff08;qqtech&#xff09;等综合 日本软银公司成立于1981年&#x…

c#扩展方法的理解(二:接口)

namespace ExtensionInterfaceMethod {class Program{static void Main(string[] args){//使用接口变量来调用扩展方法IBasicInterface bii new BasicImplement();bii.SubStract(9, 3); }}//先创建一个简单的接口public interface IBasicInterface{int Add(int x, …

Halcon算子学习:create_sheet_of_light_model

create_sheet_of_light_model (ProfileRegion : : GenParamName, GenParamValue : SheetOfLightModelID) 创建一个执行线结构光技术3D测量的的模型 输入&#xff1a; ProfileRegion 包含要处理的轮廓的图像的ROI。&#xff08;如果所提供的区域不是矩形的&#xff0c;则使用其…

腾讯研究院院长司晓:互联网大脑的人文侧面

1989年万维网推出至今&#xff0c;互联网已经走过了30个年头。在这激荡的30年&#xff0c;随着社交网络、移动通信、云计算、物联网、工业互联网、大数据、人工智能等新技术和新事物不断涌现&#xff0c;互联网持续建立起复杂而庞大的连接&#xff0c;成为驱动经济与社会快速变…

C++对单向链表进行排序

#include <iostream> using namespace std; struct student {int num;char name[10];float score[3];float sum;student *next; };void main() {student a[5];student *h, *curr, *temp, *last; //h头指针&#xff0c;curr当前指针&#xff0c;last当前指针的上一个指针…

第六周周总结

在第六周中是忙碌的&#xff0c;对于高数&#xff0c;上课的内容也在快速的翻篇&#xff0c;我的大脑也在快速的运转着&#xff0c;讲概念的时候我很难理解过来&#xff0c;但是讲习题的时候勉勉强强能听的懂&#xff0c;每次在听不懂的地方我都会打个问号&#xff0c;以便于自…

Halcon算子学习:get_sheet_of_light_result

get_sheet_of_light_result ( : ResultValue : SheetOfLightModelID, ResultName : ) 获得用线结构光技术进行测量的标志性结果 输出&#xff1a; ResultValue 理想的测量结果。 SheetOfLightModelID 要使用的线结构光模型的句柄 输入&#xff1a; ResultName 规定应提供何…

pytorch查看模型的可训练参数

for name, param in model.named_parameters():if param.requires_grad:print(name,:,param.size())

Oracle 循环相关

1.简单的循环以loop关键字开始, exit when子句退出循环, end loop子句为循环结束标志。DECLAREPI CONSTANT NUMBER (9, 7) : 3.1415926;RADIUS INTEGER (5);AREA NUMBER (14, 2);BEGINRADIUS : 3;LOOPAREA : PI * POWER (RADIUS, 2);DBMS_OUTPUT.put_line (半…

5G芯片Top10一览,谁才是最后的赢家?

来源&#xff1a;Electronic Products、电子工程世界从无线网络基础设施和基站到智能手机再到物联网设备应用&#xff0c;这些芯片组有望简化向5G通信的过渡。5G有望提供一个完全互联的移动世界&#xff0c;其市场范围从联网汽车、智能城市、智能手机到物联网(IoT)设备&#xf…

HALCON标定板制作、标准文件输出方法、算子讲解

利用 Halcon软件自制标定板 参考博客&#xff1a; halcon相机标定及图像矫正 Halcon学习 标定助手 关键算子&#xff1a; gen_caltab ( : : XNum, YNum, MarkDist, DiameterRatio, CalPlateDescr, CalPlatePSFile : ) 为具有矩形排列标记的标定板生成标定板描述文件和相应的后…

乘法逆元小结

在求解除法取模问题(a/b)%m时&#xff0c;我们可以转化为(a%(b∗m))/b&#xff0c; 但是如果b很大&#xff0c;则会出现爆精度问题&#xff0c;所以我们避免使用除法直接计算。 可以使用逆元将除法转换为乘法&#xff1a; 假设b存在乘法逆元&#xff0c;即与m互质&#xff0…

国产光刻机的现状究竟如何?

来源&#xff1a;人民网-上海频道随着信息社会的迅速发展&#xff0c;手机、电脑、电视等各种电子设备越来越“迷你”&#xff0c;从之前的“大哥大”到现在仅仅几个硬币厚的时尚手机&#xff0c;从老式的矮胖电视到如今轻薄的液晶电视&#xff0c;都不离开集成电路的发展&…

pytorch自定义卷积核权值参数

pytorch中构建卷积层一般使用nn.Conv2d方法&#xff0c;有些情况下我们需要自定义卷积核的权值weight&#xff0c;而nn.Conv2d中的卷积参数是不允许自定义的&#xff0c;此时可以使用torch.nn.functional.conv2d简称F.conv2d torch.nn.functional.conv2d(input, weight, biasN…

如何使用UR机器人模拟软件URsim

如何使用UR机器人模拟软件URsim 机器人软件适用版本&#xff1a;Polyscope v1.3及以上 适用机器人&#xff1a;UR3、UR5、UR10 由于优傲机器人的系统是基于Linux核心开发的&#xff0c;模拟软体URsim也是在Linux系统下运行&#xff0c;通常大家使用的电脑系统为Windows&#…

C++中派生类隐式调用与显式调用基类的构造函数

通过派生类的构造函数调用基类的构造函数有两种方式&#xff0c;隐式和显式两种。 所谓隐式方式就是在派生类的构造函数中不指定对应的基类的构造函数&#xff0c;这个时候调用的是基类的默认构造函数(即含有默认参数值或不带参数的构造函数)。而所谓显式方式&#xff0c;就是在…

中国团队新型类脑芯片登上《自然》封面

来源&#xff1a;澎湃新闻网从AlphaGo战胜人类顶级围棋选手&#xff0c;到人工智能系统以90%准确率诊断儿科疾病&#xff0c;近年来&#xff0c;人工智能的突破大多从智能的某个领域接近或超过人类智能&#xff0c;距离达到人类水平的人工通用智能&#xff08;AGI&#xff0c;A…

20145324 《Java程序设计》第6周学习总结

20145324 《Java程序设计》第6周学习总结 教材学习内容总结 第十章 1、使用输入串流将数据从来源取出 InputStream 使用输出串流将数据写入目的地 OutStream 2、dump()方法并没有限定来源或目的地真实形式&#xff0c;依赖InputStream、OutStream 3、可以使用dump()从HTTP服务器…