图论连通性

无向图

  • 割点:删除x和与x相连的边,图不再连通,x为割点
  • 割边:删去该边e,图不再连通,e为割边
  • 点双连通分量:其本身不存在割点,但可以有原图的割点(此时在这个点双中就是普通的点),极大图,一个点双中可以有多个原图的割点
  • 边双连通分量:其本身不存在割边,极大图
  • 点双不具有传递性,边双具有传递性((x,y),(y,z)=>(x,z))

Tarjan

  •  时间戳dfn:访问到的时间
  • 返祖边:搜索树上连向其祖先节点的边
  • 由于搜索树结构,不存在横向边(连向同层节点的边)
  • low[u]定义:u和以u为根的子树通过返祖边(包括树边和非树边)能连到的最小的dfn
  • 若是一条树边:low[u]=min(low[v[,low[u])
  • 若是一条非树边:low[u]=min(low[u],dfn[v])

求割点

  • 割点满足:其儿子的low[v]>=dfn[u],即没有儿子跨过u,儿子与u相连只有树边
  • 对于根要判断儿子个数大于1
  • 可以走反向边
  • 特判为根且搜索树上只有一个儿子,此时注意重边
  • 求a,b间的割点,tarjan(a)判断如下
    if(low[v]>=dfn[x]){if(x!=a&&x!=b&&dfn[x]<=low[b])ge[x]=true;
    }

求点双

  •  每次访问到一个点将其入栈
  • 若满足low[v]>=dfn[u],则出栈直到v出,此时出栈的所有点和v是一个点双
  • 每个点双,每个点都在一个环上,若点双有奇环,则所有点都在奇环
  • 判奇环,二分图黑白染色

求割边

  • 割边满足: 一条边只走一次,v没有另一条边到达u(父亲)即low[v]>dfn[u]
  • 可以避免重边

 求边双

  • 一边只走一次,若low[u]==dfn[u](除了树边,没有其他到树上祖先的边),则为边双

点双缩点连图

  • 割点单独为一个点,每个点双除割点,缩成一个点
  • 割点向其所在的点双连边

边双缩点连图

  • 每个边双缩点,用桥相连 

缩点连图

  • 转为无向无环图 

有向图

  • 强连通:图中存在路径u--->v和v--->u
  • 弱连通:图中只存在路径u--->v或v--->u
  • 强连通分量:该子图中对于任意一点对,存在路径u--->v和v--->u,极大图

Tarjan

  • 时间戳dfn
  • low[u]为u和以u为根的子树中能连到的还未出栈的最小dfn
  • 访问到则入栈
  • dfn[u]=low[u],即到该点往上不会有强连通(有向边),
  • 出栈直到u出栈,此时出栈的点为一个强连通分量

 强连通缩点

  • 将有向图,转为有向无环图
  • 之后可以考虑入度出度,topu排序dp
  • 注意会有重边,所以缩点连边时要判断是否已经连上,不要重复计算入度出度
  • 求加入最少的边变成一个强连通,先缩点
    int a=0,b=0;
    for(int i=1;i<=cc;++i){if(!in[i])a++;if(!out[i])b++;
    }
    if(cc==1)std::cout<<0<<std::endl;
    else std::cout<<max(a,b)<<std::endl;

代码

  • 割点
        auto tarjan=[&](auto &&tarjan,int x)->void{dfn[x]=low[x]=++tt;int ch=0;for(auto v:G[x]){if(!dfn[v]){tarjan(tarjan,v);low[x]=min(low[x],low[v]);if(low[v]>=dfn[x]){ch++;if(x1!=rt||ch>1)ge[x]=true;}}else low[x]=min(low[x],dfn[v]);}if(rt==x&&ch==1)ge[x]=false;};

  • 点双,缩点
            std::vector<int> dfn(n+5,0),low(n+5,0);int tt=0;std::vector<int> sz(n+5,0),col(n+5,0);int cc=0;std::stack<int> st;std::vector<std::vector<int>> hs(n+5);std::vector<bool> ge(n+5,false);int rt=0;auto tarjan=[&](auto &&tarjan,int x)->void{dfn[x]=low[x]=++tt;int ch=0;st.push(x);for(auto v:G[x]){if(!dfn[v]){tarjan(tarjan,v);low[x]=min(low[x],low[v]);if(low[v]>=dfn[x]){ch++;if(x!=rt||ch>1){ge[x]=true;}int y;cc++;//缩点do{y=st.top();st.pop();col[y]=cc;sz[cc]++;hs[cc].push_back(y);}while(y!=v);hs[cc].push_back(x);sz[cc]++;//割点放入}}else low[x]=min(low[x],dfn[v]);}};for(int i=1;i<=n;++i)if(!dfn[i]){rt=i;tarjan(tarjan,i);}

  • 割边,边双,缩点
        std::vector<int> dfn(n+5,0),low(n+5,0);int tt=0;std::vector<int> sz(n+5,0),col(n+5,0);int cc=0;std::stack<int> st;std::vector<std::vector<int>> hs(n+5);auto tarjan=[&](auto &&tarjan,int x,int p)->void{dfn[x]=low[x]=++tt;st.push(x);for(auto [v,i]:G[x]){//i为边的编号if(i==p)continue;if(!dfn[v]){tarjan(tarjan,v,i);low[x]=min(low[x],low[v]);
    //                if(low[v]>dfn[x]){
    //                    std::cout<<i<<std::endl;
    //                }}else low[x]=min(low[x],dfn[v]);}if(low[x]==dfn[x]){int y;cc++;do{y=st.top();st.pop();col[y]=cc;sz[cc]++;hs[cc].push_back(y);}while(y!=x);}};for(int i=1;i<=n;++i)if(!dfn[i])tarjan(tarjan,i,0);

  • 强连通分量
        std::vector<int> dfn(n+5,0),low(n+5);int tt=0;std::stack<int> st;std::vector<std::vector<int>> hs(n+5);std::vector<int> col(n+5,0),sz(n+5,0);int cc=0;auto tarjan=[&](auto &&tarjan,int x)->void{dfn[x]=low[x]=++tt;st.push(x);for(auto v:G[x]){if(!dfn[v]){tarjan(tarjan,v);low[x]=min(low[x],low[v]);}else if(!col[v])low[x]=min(low[x],dfn[v]);}if(dfn[x]==low[x]){++cc;int y;do{y=st.top();st.pop();col[y]=cc;sz[cc]++;hs[cc].push_back(y);}while(y!=x);}};for(int i=1;i<=n;++i){if(!dfn[i])tarjan(tarjan,i);}
     

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

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

相关文章

视频播放器的问题

<template><div class"app-container"><el-form :model"queryParam" ref"queryForm" :inline"true"><el-form-item label"题目ID&#xff1a;"><el-input v-model"queryParam.id" cle…

2-33 基于matlab的用于计算无故障的斜齿轮对啮合时接触线长度随时间的变化

基于matlab的用于计算无故障的斜齿轮对啮合时接触线长度随时间的变化&#xff0c;根据需求设置斜齿轮对的相应参数&#xff0c;得到结果。程序已调通&#xff0c;可直接运行。 2-33 斜齿轮对啮合时接触线长度 齿轮参数 - 小红书 (xiaohongshu.com)

【matlab】大数据基础与应用实例

目录 引言 线性回归模型 基本形式 最小二乘法 多元线性回归 线性回归的假设 模型评估 应用 独热编码 原理 应用场景 优点 缺点 数据收集 数据可视化 数据处理与分析 完整代码 引言 线性回归模型 线性回归模型是一种用于预测连续值输出&#xff08;或称为因变…

【RHCE】综合实验0710综合实验

题目&#xff1a; 主服务器192.168.244.130 防火墙允许服务的放行&#xff1a; selinux放行 [rootlocalhost ~]# ll -Z /nfs/rhce 总用量 4 -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 8 7月 10 16:52 index.html -rw-r--r--. 1 nobody nobody system_…

python爬虫网页解析模块及测试案例详解

xpath模块 xpath模块基本使用方法 测试网页 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"/><title>Title</title> </head> <body><ul><li id"l1" class"c1&q…

​前端Vue自定义签到获取积分弹框组件设计与实现

摘要 随着前端技术的不断演进&#xff0c;开发的复杂性日益凸显。传统的整体式开发方式在面临功能迭代和修改时&#xff0c;常常牵一发而动全身&#xff0c;导致开发效率低下和维护成本高昂。组件化开发作为一种解决方案&#xff0c;通过实现模块的独立开发和维护&#xff0c;…

frp内网穿透ssh,tcp经过服务器慢速和p2p模式实现高速吃满上传带宽

ssh_server aliyun_server ssh_client 办公室 云服务器 家 在家里经过云服务器中转&#xff0c;很慢&#xff0c;但是很稳定 使用p2p穿透&#xff0c;速度可以直接拉满 ssh_server cc.ini # 连接服务器配置 [common] server_addr 1…

InjectFix 热更新解决方案

简介 今天来谈一谈&#xff0c;项目种的客户端热更新解决方案。InjectFix是腾讯xlua团队出品的一种用于Unity中C#代码热更新热修复的解决方案。支持Unity全系列&#xff0c;全平台。与xlua的思路类似&#xff0c;InjectFix解决的痛点主要在于Unity中C#代码写的逻辑在发包之后无…

【数智化CIO展】沃太能源CIO陈丽:AI 浪潮下的中国企业数智化转型机遇与挑战...

陈丽 本文由沃太能源CIO陈丽投递并参与由数据猿联合上海大数据联盟共同推出的《2024中国数智化转型升级优秀CIO》榜单/奖项评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 在当今飞速发展的数字时代&#xff0c;中国企业正面临着前所未有的变革机遇和挑战。“中国企业数…

Flowable-流程图标与流程演示

BPMN 2.0是业务流程建模符号2.0的缩写。它由Business Process Management Initiative这个非营利协会创建并不断发展。作为一种标识&#xff0c;BPMN 2.0是使用一些符号来明确业务流程设计流程图的一整套符号规范&#xff0c;它能增进业务建模时的沟通效率。目前BPMN2.0是最新的…

链路追踪系列-01.mac m1 安装zipkin

下载地址&#xff1a;https://hub.docker.com/r/openzipkin/zipkin jelexjelexxudeMacBook-Pro zipkin-server % pwd /Users/jelex/Documents/work/zipkin-server 先启动Es: 可能需要先删除 /Users/jelex/dockerV/es/plugins 目录下的.DS_Store 当端口占用时再次启动&#x…

Chromium CI/CD 之Jenkins实用指南2024-Windows安装篇(一)

1. 引言 在现代软件开发过程中&#xff0c;持续集成和持续部署&#xff08;CI/CD&#xff09;是确保高效、稳定软件交付的关键实践。Jenkins作为一款广泛使用的自动化服务器&#xff0c;通过其强大的插件体系和灵活的配置&#xff0c;支持各种操作系统和开发环境。为了帮助开发…

excel 百分位函数 学习

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、函数说明PERCENTILE 函数PERCENTILE.inc 函数PERCENTILE.exc 函数QUARTILE.EXC 函数 二、使用步骤总结 前言 excel 百分位函数 Excel提供了几个函数用于…

计算机网络——常见问题汇总

1. introduction 1.1 Explain what a communication protocol is and why its important. A communication protocol is a set of rules and conventions(公约) that govern(统治) how data is transmitted and received between devices(设备), systems, or entities in a ne…

Linux vim的使用(一键安装则好用的插件_forcpp),gcc的常见编译链接操作

vim 在Linux系统上vim是个功能还比较完善的软件。但是没装插件的vim用着还是挺难受的&#xff0c;所以我们直接上一款插件。 我们只需要在Linux上执行这个命令就能安装(bite提供的) curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh …

Qt中https的使用,报错TLS initialization failed和不能打开ssl.lib问题解决

前言 在现代应用程序中&#xff0c;安全地传输数据变得越来越重要。Qt提供了一套完整的网络API来支持HTTP和HTTPS通信。然而&#xff0c;在实际开发过程中&#xff0c;开发者可能会遇到SSL相关的错误&#xff0c;例如“TLS initialization failed”&#xff0c;cantt open ssl…

pytorch-LSTM

目录 1. RNN存在的问题2. LSTM的由来3. LSTM门3.1 遗忘门3.2 输入门3.3 输出门 4. LSTM是如何减轻梯度弥散问题 1. RNN存在的问题 如下图&#xff1a;RNN能满足预测下一个单词&#xff0c;但是对于获取更多的上下文信息就做不到了。 2. LSTM的由来 RNN能做到短时记忆即shor…

适合创业公司使用的wordpress主题

对于创业公司来说&#xff0c;‌选择一个适合的WordPress主题至关重要&#xff0c;‌它不仅能够提升公司网站的外观和用户体验&#xff0c;‌还能帮助优化搜索引擎排名&#xff0c;‌从而吸引更多的潜在客户。‌以下是一些推荐的WordPress主题&#xff0c;‌特别适合创业公司使…

抖音运营_商品标题优化关键词优化

一 为什么要优化标题&#xff1f; 标题是爆单的核心因素 有搜索的地方就有关键词检索 抖音现在重点扶持搜索板块 关键词检索不仅为了 消费者、也为了 达人。 二 关键词的组成和原则 1 核心词 n. &#xff08;你卖的东西&#xff09; 示例&#xff1a;连衣裙 2 属性词 …

Linux -- 认识 gdb

目录 前言&#xff1a; Debug 模式和 Release 模式 怎么安装 gdb&#xff1f;&#xff08;CentOS7&#xff09; 怎么使用 gdb&#xff1f; 进入 gdb 模式&#xff1a; 查看代码&#xff1a; 执行代码&#xff1a; 断点&#xff1a; 打断点&#xff1a; 查看断点&#x…