2023/1/8总结

news2024/11/17 17:38:17

今天学了了强连通算法

Tarjan算法 

Tarjan算法是一种求解有向图强连通分量的线性时间的算法,他运用到了DFS算法以及DFS的特性和数据结构——栈。

算法介绍:如果两个顶点可以相互通达,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通分量(strongly connected components)。

举一个列子,如下图所示:

这是一个有向图,我们可以了解到该图有4给个强连通分量,分别是{A,B,C},{D},{E},{F}.

首先我们需要使用存储图的办法,这边有俩个一个是邻接表,一个是邻接矩阵。我这里使用的是邻接矩阵。

这个算法使用到了DFS算法,我们设立一个时间戳,每访问一个节点给他一个时间,这里我们需要俩个全局变量——dfn、low以及一个栈。

在调用dfs函数的时候我们把该点入栈,时间戳++,然后遍历该点可以继续走下去的点,去遍历他。同时我们要看遍历下去的点里面的low值是不是比当前节点的low值小,如果小,我们是需要更新当前节点的low值(这个稍后再解释)

这里A节点下前面的1表示dfn的值,而后面的表示low的值,我们可以发现A点可以走的点为B,E,由于dfs的特性,我们会先走到B点,B点的时间戳是2,dfn和low数组的值分别是2,2.

然后会从B遍历到C,D,我们到C会更新到3,3,同理D的值也会变成4,4。

D点此时是没有可以继续往下的值了,此时我们需要判断当前dfn的值是否对应low的值,这个和并查集有点相似,是看它的祖先,很明显D点是自己一个人构成环,所以D点出栈。

然后可以从C到的点还有A点,此时A点是已经访问过的节点,所以我们需要判断它是否还在栈里面,我们发现是的,于是我们执行low[x]=min(low[x],low[y]),我们需知道此时y也就是A节点的low值是1,所以我们需要给C点low赋值为1,因为C能够通往还在栈中的点说明是构成了强连通分量。

然后我们会返回到B点,B点其实也执行完了C点的dfs,下面要执行low[x]=min(low[x],low[y]),此时y的值是C点,C点的low已经变成了1,那么B点也相应的变成了1.

B点会接下来到D点我们会发现D点已经被访问过了,而且D也不再栈里面了,我们不执行任何操作。

这个时候该返回了,返回到B,此时B需要访问D,我们发现D已经走过,我们就需要再判D此时是否还在栈里面,我们发现上面的时候D已经出栈了,所以不执行任何操作,继而返回到A点。

此时A点深搜完了B点,会继续到E点,(下面是一样的了)搜到E赋值dfn为5,low为5……

最后会变成:

我们最后会全部出栈,每一次出栈都会找low值一样的一起出栈,是代表他们同属于一个强连通分量。

C代码如下:

//tarjan算法
#include<stdio.h>
#define N 100
int e[N][N],book[N];
int n,m,time;
int stack[N],top,dfn[N],low[N];
int min(int a,int b)
{
	if(a>b) return b;
	return a;
}
int fd(int x)
{
	int i;
	for(i=0;i<top;i++)
	{
		if(x==stack[i]) return 1;
	}
	return 0;
}
int tarjan(int x)
{
	dfn[x]=low[x]=++time;
	stack[top++]=x;
	int i,k;
	for(i=1;i<=n;i++)
	{
		if(e[x][i]&&dfn[i]==0)
		{
			tarjan(i);
			low[x]=min(low[x],low[i]);
		}
		else if(e[x][i]&&dfn[i]&&fd(i))
		{
			low[x]=min(low[x],low[i]);
		}
	}
	if(dfn[x]==low[x])
	{
		k=low[x];
		while(low[stack[--top]]==k&&top>=0)
		{
			printf("%d ",stack[top]);
		}
		top++;
		puts("");
	}
	return 0;
}
int main()
{
	int i,x,y;
	puts("请输入顶点个数:");
	scanf("%d",&n);
	puts("请输入边的个数:");
	scanf("%d",&m);
	puts("请输入哪些顶点是可以连通的:");
	for(i=0;i<m;i++)
	{
		scanf("%d%d",&x,&y);
		e[x][y]=1;
	}
	tarjan(1);
	return 0;
}

C++代码如下:

//tarjan算法
#include<iostream>
#include<bits/stdc++.h>

using namespace std;

const int N=100;
int e[N][N],book[N];
int n,m,t;
int s[N],top,dfn[N],low[N];
int min(int a,int b)
{
	if(a>b) return b;
	return a;
}
int fd(int x)
{
	int i;
	for(i=0;i<top;i++)
	{
		if(x==s[i]) return 1;
	}
	return 0;
}
int tarjan(int x)
{
	dfn[x]=low[x]=++t;
	s[top++]=x;
	int i,k;
	for(i=1;i<=n;i++)
	{
		if(e[x][i]&&dfn[i]==0)
		{
			tarjan(i);
			low[x]=min(low[x],low[i]);
		}
		else if(e[x][i]&&dfn[i]&&fd(i))
		{
			low[x]=min(low[x],low[i]);
		}
	}
	if(dfn[x]==low[x])
	{
		k=low[x];
		while(low[s[--top]]==k&&top>=0)
		{
			printf("%d ",s[top]);
		}
		top++;
		puts("");
	}
	return 0;
}
int main()
{
	int i,x,y;
	cout << "请输入顶点个数:" << endl;
	cin >> n ;
	cout << "请输入边的个数:" << endl;
	cin >> m ;
	cout << "请输入哪些顶点是可以连通的:" << endl;
	for(i=0;i<m;i++)
	{
		cin >> x >> y ;
		e[x][y]=1;
	}
	tarjan(1);
	return 0;
}

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

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

相关文章

LeetCode题解 二叉树(十三):701 二叉搜索树的插入操作;450 删除二叉搜索树中的结点

701 二叉搜索树的插入操作 medium 给定二叉搜索树&#xff08;BST&#xff09;的根节点和要插入树中的值&#xff0c;将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据保证&#xff0c;新值和原始二叉搜索树中的任意节点值都不同。 如果要按照题目中所说改变二叉…

渗透测试中的常用编码

渗透测试中的常用编码 页面编码 在网页设置网页编码 在中加入设置特定html标签 这样页面的编码就会变成utf-8 &#xff0c;如果没有设置编码就会使用默认 的编码&#xff0c;而浏览器默认编码与之不同就会出现乱码。 常用的有三种格式分别是 utf-8、gbk、gbk2312 ascii编码…

_Linux 进程信号-信号处理篇

文章目录前言捕捉信号1. 内核如何实现信号的捕捉2. sigaction代码验证可重入函数volatile(关键字)SIGCHLD信号实验一实验二前言 信号发送 信号处理 已经讲过&#xff0c;本章讲解信号处理最后一部分。 捕捉信号 信号捕捉过程图 经过信号捕捉过程图&#xff1a;我们知道信号…

语音文件分析

语音文件格式的重要参数 语音波形,它的这个文件,主要的格式就是采样率,那么电话或者嵌入式设备,采样率一般是8000Hz,就一秒钟8000个点,如果是PC机麦克风,那是16K,就一秒钟是16000个点,像这个CD是高保真的,音乐唱片的是用这个44.1K。 量化位数,又叫采样精度,…

绿通科技在创业板通过注册:收入依赖美国市场,张志江为实控人

2023年1月6日&#xff0c;证监会发布关于同意广东绿通新能源电动车科技股份有限公司&#xff08;下称“绿通科技”或“绿通电动车”&#xff09;、杭州国泰环保科技股份有限公司首次公开发行股票注册的批复。换句话说&#xff0c;证监会同意上述两家公司的创业板IPO注册。 同日…

【手写 Vue2.x 源码】第十一篇 - Vue 的数据渲染流程

一&#xff0c;前言 上篇&#xff0c;主要介绍了数组数据变化的观测情况&#xff0c;涉及以下几个点&#xff1a; 实现了数组数据变化被劫持后&#xff0c;已重写原型方法的具体逻辑&#xff1b;数组各种数据变化时的观测情况分析&#xff1b; 目前为止&#xff0c;数据劫持…

webpack 如何编写 loader

三种本地开发测试 loader 的方法 1. 匹配&#xff08;test&#xff09;单个 loader 你可以通过在 rule 对象使用 path.resolve 指定一个本地文件&#xff1a; webpack.config.js const path require(path);module.exports {//...module: {rules: [{test: /\.js$/,use: [{…

Ansible Automation Platform - 在 RHEL 安装 Ansible Automation Platform 2.3 环境

《OpenShift / RHEL / DevSecOps 汇总目录》 文本已在 RHEL 9 AAP 2.3 环境中进行验证。 说明&#xff1a; 本文介绍如何在一个节点上部署一套 all-in-one 的 Ansible Automation Platform 2.3 的运行环境。红帽 Ansible Automation Platform 2.3 需要至少 RHEL 8.4 以上的环…

【EHub_tx1_tx2_E100】Ubuntu18.04 + ROS_ Melodic + Velodyne VLP-16雷达 测试使用

简介&#xff1a;介绍 Velodyne VLP-16 16线激光雷达 在EHub_tx1_tx2_E100载板&#xff0c;TX1核心模块环境&#xff08;Ubuntu18.04&#xff09;下测试ROS驱动&#xff0c;打开使用RVIZ 查看点云数据&#xff0c;本文的前提条件是你的TX1里已经安装了ROS版本&#xff1a;Melod…

HashMap、HashTable、ConcurrentHashMap之间的区别及常见面试题

Java集合类有的集合类是存在线程安全的问题&#xff0c;但是由于之前对于集合类的使用都是在单线程的情况下使用的&#xff0c;不没有在多线程环境下使用&#xff0c;所以不涉及线程安全的问题&#xff1b;这篇博客着重讲解一下多线程环境下使用哈希表。HashMapHashMap本身不是…

一些开发时常用的网站或命令

目录关于gitgit下载网址git安装教程Gortoisegit下载地址关于PythonAnyWhere关于Linux压缩与解压命令关于python的相对与绝对路径使用_\_file_\_实现跨平台关于宝塔面板关于浏览器驱动下载本博客首次编辑于2023.01.04 &#xff0c;后续将持续进行更新 关于git git下载网址 gi…

Linux - 系统文件目录说明

目录/ - 根目录/bin - 用户基础二进制文件目录/boot - 静态启动文件/dev - 设备文件/etc - 配置文件/home - 主目录/lib - 基础共享库/lib64 - 64位基础共享库/lostfound - 可恢复的文件/media - 可移动媒体/mnt - 临时挂载点目录/opt - 自选软件包/proc - 内核 & 进程文件…

【Node】事件循环机制

Node 中的异步 API 定时器&#xff1a;setTimeout、setIntervalI/O 操作&#xff1a;文件读写、数据库操作、网络请求…Node 独有的 API&#xff1a;process.nextTick、setImmediate 事件循环的流程 Node 的事件循环分为 6 个阶段&#xff0c;这 6 个阶段会按顺序反复运行运行…

高并发内存池项目

文章目录一、项目介绍二、什么是内存池2.1 池化技术2.2 内存池2.3 内存池的作用2.4 malloc三、设计定长内存池四、高并发内存池整体框架设计六、threadcache6.1 threadcache整体设计6.2 threadcache哈希桶映射对齐规则6.3 编写对齐和映射的相关函数6.4 编写ThreadCache类6.5 th…

电网头条知识竞赛题库答案(自动答题)

今天教你们自动完成2023年电网头条的知识竞赛&#xff0c;小编也为大家安排好了教程&#xff0c;首先呢需要知道电网助手&#xff0c;打开电网助手网页https://wwwl.lanzouw.com/b01w803yj 为了帮到大家&#xff0c;我特地分享出来&#xff0c;希望能给大家带来一丝丝便利&…

1.3第二周 星期二Samba、FTP

目录 01 Samba文件共享服务 Samba服务基础 2.主配置文件 02 linux文件传输服务 1.用户访问的Samba 03 FTP服务概述 1.vsftp知识预备 04 操作流程&#xff1a; 1&#xff0e;使用时记得装ftp的包&#xff1a;yum install ftp -y 2&#xff0e;装完之后启动服务&am…

【北京理工大学-Python 数据分析-2.1Matplotlib库入门】

Matplotlib库的使用 Matplotlib库由各种可视化类构成&#xff0c;内部结构复杂&#xff0c;受Matlab启发。matplotlib.pyplot是绘制各类可视化图形的命令字库&#xff0c;相当于快捷方式。 import matplotlib.pyplot as plt plt.plot([3,1,4,5,2]) plt.ylabel("Grade&qu…

实战四十七:基于机器(逻辑回归随机森林线性回归)学习预测销售门店的商品销量详细教程(代码+数据)

项目概述: 使用时间序列预测来预测来Corporacin Favorita 的数据的商店销售额。 具体来说,构建一个模型来更准确地预测在不同 Favorita 商店销售的数千种商品的单位销售额。您将使用包含日期、商店和商品信息、促销和单位销售的易于理解的训练数据集来练习您的机器学习技能。…

基于java ssm springboot+VUE疫情防疫系统系统前后端分离设计和实现

基于java ssm springbootVUE疫情防疫系统系统前后端分离设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留…

Goland中使用GoPlantUml生成ER关系图

前言 Golang语言在近些年的开发语言中异军突起&#xff0c;在越来越多的公司项目中频繁出镜&#xff0c;也有越来越多的中间件选择使用Golang语言进行实现。正所谓源码之下无秘密&#xff0c;更友好地翻读源码对于理解功能特性以及后续使用非常有帮助&#xff0c;观摩学习源码也…