Living-Dream 系列笔记 第84期

news/2025/1/22 15:47:39/文章来源:https://www.cnblogs.com/XOF-0-0/p/18525025

连通性问题

  • 点双连通:在无向图中,删除一个点(不是 \(x\) 或者 \(y\))后,点 \(x\) 和点 \(y\) 仍然能够彼此到达,那么称 \(x\)\(y\) 是点双连通的。

  • 边双连通:在无向图中,删除一条边后,点 \(x\) 和点 \(y\) 仍然能够彼此到达,那么称 \(x\)\(y\) 是边双连通的。

性质

  • 点双连通不具有传递性,但边双连通具有。

    image

    如图,但 \(y\) 被删去之后,虽然 \(x,y\) 以及 \(y,z\) 都是点双连通的,但是 \(x,z\) 却不是点双连通的了。

    边双连通具有传递性是因为无论删哪条边 \(x,y\)\(y,z\) 都是边双连通的(由定义易知),这也就是说 \(x,z\) 是边双连通的。

割点

性质:

  • 至少三个点的图中才有割点。(易证)

    image

    如图,\(x\) 即为该图的割点。

判定:

若搜索树中,有从 \(x\)\(y\) 的连边,当 \(low_y \ge dfn_x\) 时(定义同 tarjan 算法),说明 \(y\) 能到达的最小时间戳是 \(x\) 的时间戳,即 \(y\)\(x\)\(x\) 之前的结点「隔开」, 因此 \(x\) 可能是割点。

只要 \(x\) 不是搜索树的根结点,或者 \(x\) 是根结点 且 \(x\) 的子结点大于 \(1\) 个,那么 \(x\) 就是割点。

P3388 & UVA10199

板子。

code
#include<bits/stdc++.h>
using namespace std;const int N=1e5+5;
int n,m,cnt,rt;
vector<int> G[N],ans;
int dfn[N],low[N];
bool cut[N];void tarjan(int cur){dfn[cur]=low[cur]=++cnt;int num=0;for(int i:G[cur]){if(!dfn[i]){tarjan(i);low[cur]=min(low[cur],low[i]);++num;if(low[i]>=dfn[cur]&&(cur!=rt||num>1)){cut[cur]=1;}}else{low[cur]=min(low[cur],dfn[i]);}}
}int main(){ios::sync_with_stdio(0);cin.tie(0);cin>>n>>m;for(int i=1,u,v;i<=m;i++){cin>>u>>v;G[u].push_back(v);G[v].push_back(u);} for(int i=1;i<=n;i++)if(!dfn[i])rt=i,tarjan(i);for(int i=1;i<=n;i++)if(cut[i])ans.push_back(i);cout<<ans.size()<<'\n';for(int i:ans)cout<<i<<' ';return 0;
} 

CF22C

构造题,从简单情况开始考虑

首先 \(m\) 必须 \(\ge n-1\),否则图不可能联通。

\(m=n-1\) 时,显然让 \(v\) 作为根,其他点直接向 \(v\) 连边是最简单的方案,其他方案都可以通过改变树的形态的方式使得其与此方案等价。

接着,当 \(m>n-1\) 时,为了使添加的边尽可能多,我们只能孤立出一个子节点,其他的 \(n-2\) 个子节点连出完全图即可。

于是 \(m\) 的上界即为 \(n-1+\frac{(n-2) \times (n-3)}{2}\),做完了。

code
//
//  CF22C.cpp
//
//
//  Created by _XOFqwq on 2024/11/7.
//#include <bits/stdc++.h>
using namespace std;int n,m,v;void print(int x){for (int i=1; i<=n; i++) {if (!m) {return;}if (i!=v&&i!=x) {for (int j=i+1; j<=n; j++) {if (!m) {return;}if (j!=v&&j!=x) {cout<<i<<' '<<j<<'\n',m--;}}}}
}int main(){ios::sync_with_stdio(0);cin.tie(0);cin>>n>>m>>v;if (m<n-1||m>n-1+(n-2)*(n-3)/2) {cout<<-1;} else {for (int i=1; i<=n; i++) {if (i!=v) {cout<<v<<' '<<i<<'\n';}}m-=n-1;if (v==n) {print(n-1);} else {print(n);}}return 0;
}

P3469

容易发现每个点都有一个基础贡献 \(2 \times (n-1)\),只有割点才会产生额外贡献。

对于割点,将它提起来作为根,于是有子树内的联通块和子树外的联通块。子树内的贡献算两次,单点算两次,然后子树外的再算两次即可。具体见代码实现。

code
//
//  P3469.cpp
//
//
//  Created by _XOFqwq on 2024/11/7.
//#include <bits/stdc++.h>
#define int long long
using namespace std;const int N=5e5+5;
int n,m,cnt,rt;
int siz[N],ans[N];
bool cut[N];
int dfn[N],low[N];
vector<int> G[N];void tarjan(int cur){dfn[cur]=low[cur]=++cnt;siz[cur]=1;int num=0,sum=0;for (int i : G[cur]) {if (!dfn[i]) {tarjan(i);siz[cur]+=siz[i];low[cur]=min(low[cur],low[i]);num++;if (low[i]>=dfn[cur]&&(cur!=rt||num>1)) {sum+=siz[i];ans[cur]+=siz[i]*(n-siz[i]); //子树内两次 + 子树外一次 + 子树内与单点cut[cur]=1;}} else {low[cur]=min(low[cur],dfn[i]);}}if (cut[cur]) {ans[cur]+=(n-sum-1)*(sum+1)+n-1; //子树外一次 + 子树外与单点 + 一次单点} else {ans[cur]=2ll*(n-1);}
}signed main(){ios::sync_with_stdio(0);cin.tie(0);cin>>n>>m;for (int i=1,u,v; i<=m; i++) {cin>>u>>v;G[u].push_back(v);G[v].push_back(u);}rt=1,tarjan(1);for (int i=1; i<=n; i++) {cout<<ans[i]<<'\n';}return 0;
}

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

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

相关文章

谷歌浏览器最好的视频下载器插件-CocoCut视频下载器

这是我目前遇到最好用的视频下载插件,没有之一。 教程如下:打开播放视频的页面,选择你的插件,点击下载即可。如下图:下载地址:https://chromewebstore.google.com/detail/video-downloader-cococut/ekhbcipncbkfpkaianbjbcbmfehjflpf 官方网址:https://cococut.net 免费…

具有低开关损耗的: FF100R12W1T7EB11 FF300R12ME7PB11 FF75R12W1T7EB11 FF800R12KE7PE IGBT模块,简单了解下它们的资料

FF800R12KE7PE是62 mm 1200 V, 800 A 低饱和压降的Fast trench IGBT半桥模块,采用TRENCHSTOP™ IGBT7和发射极控制第7代二极管。关于英飞凌IGBT模块:这些产品组合包括不同的先进IGBT功率模块产品系列,它们拥有不同的电路结构、芯片配置和电流电压等级,适用于几乎所有应用。…

程序员 SEO 系列:如何找到更多搜索关键词?

本文分享有效的关键词挖掘策略,帮助你识别低竞争、高流量的蓝海关键词,提升网站排名并带来持续流量增长。了解如何通过竞品分析、长尾词挖掘等方法,发掘适合你网站的关键词,快速提升 SEO 效果。 一、关键词研究(挖词)的目的? SEO 挖词的目的是通过深入 Research 和识别有…

agc032 A~E 题解

a 倒推,每次删掉最后一个b[i]=i的即可 b 一开始发现可以构造完全二分图,使两边和同为S,这样每个点的和=对面二分图点的和=S,然后n=6和为奇数 进一步发现可以直接分成A组组内和为B的组,然后组之间连边,此时S=(A-1)B,有AB=n(n+1)/2 当n为奇数时取A=(n+1)/2,B=n,n单独一组…

devc++配置opengl库

由于VisualStudio太占内存,所以用老古董devc++配图形学的环境。 用到的文件下载链接 Step1:建项目 首先打开dev 点文件--新建--项目--Multimedia--OpenGL c++/c都行(我这里用的c++) 名称最好用英文,然后确定,保存的地方也最好没有中文路径 Step2:添加库文件 找到DEV-C++的…

达梦数据库DM Exception字符串截断错误,略坑~

前言 我之前在使用达梦数据库的时候,遇到了很多很多的问题,主要对达梦数据库也不是很熟悉,它的语法和我所熟悉的mysql和postgresql有很大的区别。 今天,讲一下我之前遇到的一个问题。这个问题的起因是用达梦数据库迁移工具,将数据库从postgresql迁移到达梦数据库。迁移之后…

引用

引用就是给变量起另外的名字,区别就是在别名前加&的符号。实质上指向同一个内存。引用的两个注意事项: 1.引用必须初始化。 2.引用初始化后不可以更改。引用做函数参数就太熟悉了,引用作函数返回值倒是没见过。 1.不能返回局部变量作为引用,任何和局部变量地址相关的操…

element-ui-plus给头像avatar增加头像框

template部分:<el-avatar shape="square" :size="50" :fit="fit":src="avatarImg"class="avatar-with-border-image"/>style部分:.avatar-with-border-image {position: relative;margin-top: 5px;margin-left: 5vh…

DBeaver如何一次性执行多条sql语句,原来和单条不一样!

前言 我之前一直是用Navicat来连接数据库的,说实话,用起来真的很舒服。 但是,后来,我离职了,换了一家新公司。新公司有一个规定,不准使用Navicat,其中的原因众所周知。由于Navicat是付费的,而公司又不想付这笔钱。而且,也不能使用破解的。于是,公司给我们推荐了DBeav…

词典编译配置文件概述

本文简要讲解了《汉文博士》词典的制作方法概述 《汉文博士》允许使用者自己编写词典文件。本文简要讲述了词典编译过程和相关配置文件的编写方法。 读者需具备XML和正则表达式的基础知识。 词典编译器 《汉文博士》的词典编译器可在“文件”菜单中点击“词典编译器”调出。 编…

安川MOTOMAN机器人NX100维修的注意事项

安川MOTOMAN机器人NX100维修,操作人员安全注意事项 整个机器人的最大动作范围内均具有潜在的危险性。 为机器人工作的所有人员 (安全管理员、安装人员、操作人员和机器人维修人员) 必须时刻树立安全第一的思想 ,以确保所有人员的安全。 • 机器人的安装区域内禁止进行任何的危…

Webrtc播放H265的技术探索(datachannel+wasm)

zlm、webrtc、H265、wasm、视频播放通过这个帖子把我对通过webrtc方式播放H265视频的技术探索过程记录下来。虽然最终不一定能够形成产品进行实现,但觉得也是一个有意义的过程。很多事情不就是这样吗?~ ----------------------------- 一。背景1)由于Webrtc具有低延时、高稳…