图论的存储、遍历,Tarjan算法

2023-05-16

图的存储

图的存储可分为顺序存储链式存储。顺序存储包括邻接矩阵边集数组,链式存储包括邻接表链式前向星十字链表邻接多重表

邻接矩阵其实就是用二维数组存边,优点是可以快速判断两节点之间是否有边,并且方便计算各节点的度(O(n)的时间复杂度);缺点是不利于增删节点,不便于访问所有邻接点。

邻接表是自己创造了两种数据结构:节点和邻接点。每个节点后面跟一串邻接点。有向图的邻接表又可分为出弧和入弧两种。邻接点的优点是便于访问所有邻接点,且空间复杂度低;缺点是不便于判断两个节点之间是否有边,也不便于判断各节点的度。

链式前向星采用了一种静态链表存储方式,将边集数组和邻接表相结合,经常使用。


const int maxn=101;
const int maxe=10001;
struct node
{
    int to,next,w;
}edge[maxe];//边集数组,一般要设置比maxn*maxn大的数,但题目有要求除外
int head[maxn];//头节点数组
int cnt=0;//记录总共有几条边
void add(int u,int v,int w)//添加一条从u到v的权值为w的边
{
    edge[cnt].to=v;
    edge[cnt].w=w;
    edge[cnt].next=head[u];
    head[u]=cnt++;
}
void dfs(int u)//遍历u的所有邻接点
{
    for(int i=head[u];i!=-1;i=edge[i].next)//i!=-1可以写为~i
    {
        int v=edge[i].to;
        int w=edge[i].w;
    }
}
int main()
{
    memset(head,-1,sizeof(head));
}

图的遍历

图的遍历根据搜索方式的不同,分为广度优先遍历和深度优先遍历。

广度优先遍历借助队列实现,深度优先遍历借助递归实现。

图的联通性

基础知识

在无向图中,如果图中任意两个节点都是联通的,则称该图为连通图

无向图的极大连通子图被称为该图的联通分量。连通图的联通分量就是它本身。

在有向图中,如果图中任意两个节点相互可达,则称该图为强连通图

有向图的极大强连通子图被称为该图的强联通分量

如果去掉无向连通图的一条边后,该图分裂为两个不连通的子图,则称该边为该图的或割边。

如果去掉无向连通图的一个点后,该图分裂为多个不连通的子图,则称该点为该图的割点

注意:删除边时,只把该边删除即可;删除点时,要删除该点及其关联的所有边。

割点和桥的关系:有割点不一定有桥,有桥一定有割点;桥一定是割点依附的边。

如果在无向图中不存在桥,则称它为边双连通图

如果在无向图中不存在割点,则称它为点双连通图

有分别依据上述两种图的将图转化为数的方法,称为e-DCC缩点 和 v-DCC缩点。

Tarjan算法

两个概念:

时间戳:dfn[u]表示节点u深度优先遍历的序号

追溯点:low[u]表示节点u或u的子孙能通过非父子边追溯到的dfn最小的节点序号

Tarjan算法有什么作用?

可以通过访问图中的每一个节点,将该图的连通分量中每一个节点的low值赋值为第一次进入这个连通分量的那个点的dfn值

无向图的桥

桥判断法则:无向边x-y是桥,当且仅当在搜索树上存在x的一个子节点y时,满足low[y]>dfn[x].

void tarjan(int u,int fa)
{
    dfn[u]=low[u]=++num;
    for(int i=head[u];~i;i=e[i].next)
    {
        int v=e[i].to;
        if(v==fa)
            continue;
        if(!dfn[v])
        {
            tarjan(v,u);
            low[u]=min(low[u],low[v]);
            if(low[v]>dfn[u])
                cout<<u<<"-"<<v<<"是桥"<<endl;
            
        }
        else
            low[u]=min(low[u],dfn[v]);
    }
}

无向图的割点

割点判定法则:若x不是根节点,则x是割点,当且仅当在搜索树上存在x的一个子节点y,满足low[y]>=dfn[x];若x是根节点,则x是割点,当且仅当在搜索树上至少存在两个子节点,满足该条件。

void tarjan(int u,int fa)
{
    dfn[u]=low[u]=++num;
    int cnt=0;
    for(int i=head[u];~i;i=e[i].next)
    {
        int v=e[i].to;
        
        if(v==fa)
            continue;
        if(!dfn[v])
        {
            tarjan(v,u);
            low[u]=min(low[u],low[v]);
            if(low[v]>=dfn[u])
            {
                cnt++;
                if(u!=root || cnt>1)
                    cout<<u<<"是割点"<<endl;
            }
        }
        else
            low[u]=min(low[u],dfn[v]);
    }
}

有向图的强连通分量

void tarjan(int u)
{
    dfn[u]=low[u]=++num;
    ins[u]=true;
    s.push(u);
    for(int i=head[u];~i;i=e[i].next)
    {
        int v=e[i].to;
        if(!dfn[v])
        {
            tarjan(v);
            low[u]=min(low[u],low[v]);
        }
        else
        	if(ins[v])
            	low[u]=min(low[u],dfn[v]);
    }
    if(low[u]==dfn[u])
    {
    	int v;
    	cout<<"强连通分量:";
    	do{
    		v=s.top();
    		s.pop();
    		cout<<v<<" ";
    		ins[v]=false;
    	}while(v!=u);
    	cout<<endl;
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图论的存储、遍历,Tarjan算法 的相关文章

  • Failed to connect to raw.githubusercontent.com port 443

    Mac 安装 homebrew xff1a 1 usr bin ruby e 34 curl fsSL https raw githubusercontent com Homebrew install master install 34 报
  • NFS配置及使用

    什么是NFS NFS Network File System 即网络文件系统 xff0c 是FreeBSD支持的文件系统中的一种 xff0c 它允许网络中的计算机之间通过TCP IP网络共享存储 在NFS的应用中 xff0c 本地NFS的客
  • 在idea中配置maven(阿里云镜像)

    1 下载maven 要使用maven当然要去下载 xff0c 可以去官网下载 xff0c 去官网下载需要自己配置 xff0c 这里可以使用我配置好的maven xff1b 链接 xff1a https pan baidu com s 1Zn
  • MTK6582资料帖和问题帖集合

    MTK6582资料帖汇总 Driver All in One V1 0 MT6572 MT6582 AOSP 发给需要的 MT6582memorydevicelist MT6582完整版DATASHEET xff0c xff1e 50M x
  • MYSQL笔记1

    MYSQL笔记 参照 MySQL数据库原理 设计与应用 清华大学出版社 第二章 数据库基本操作 2 1数据库操作 2 1 1创建数据库 create database if not exists xxx 2 1 2查看数据库 1 查看存在的
  • JetBrains学生认证

    1 首先找到JetBrains官网 JetBrains官网链接 2 找到学生申请页面 学生申请页面链接 3 选择申请方式 xff1a 官方文件 选择方式一共有四种 xff0c 较简单的是其中两种 xff0c 分别是大学电子邮箱地址和官方文件
  • Ubuntun18.04下载微信

    1 下载Wine环境包 xff1a http archive ubuntukylin com software pool partner ukylin wine 70 6 3 25 amd64 deb 2 下载微信 xff08 wine x
  • Java8使用Stream流实现List列表的查询、统计、排序、分组

    Java8提供了Stream xff08 流 xff09 处理集合的关键抽象概念 xff0c 它可以对集合进行操作 xff0c 可以执行非常复杂的查找 过滤和映射数据等操作 Stream API 借助于同样新出现的Lambda表达式 xff
  • MySQL的COUNT语句,竟然都能被面试官虐的这么惨!?

    关于数据库中行数统计 xff0c 无论是MySQL还是Oracle xff0c 都有一个函数可以使用 xff0c 那就是COUNT 但是 xff0c 就是这个常用的COUNT函数 xff0c 却暗藏着很多玄机 xff0c 尤其是在面试的时候
  • git为什么要先commit,然后pull,最后再push?而不是commit完直接push?

    情况是这样的 xff0c 现在远程有一个仓库 xff0c 分支就一个 xff0c 是master 然后我本地的仓库是从远程的master上clone下来的 大家都是clone下来 xff0c 再在自己本地改好 xff0c 再commit然后
  • docker将镜像上传到阿里云镜像仓库

    1 登录阿里云 username参数是阿里云账号 xff0c 执行后输入密码 注意后面登录的地区 beijing hangzhou等 docker login username 61 阿里云账号 registry cn hangzhou a
  • docker进入容器的方式

    进入容器 使用 d 参数时 xff0c 容器启动后会进入后台 进入容器进行操作 xff0c 包括使用 docker attach 命令或 docker exec 命令 xff0c 推荐用 docker exec 命令 attach 命令 实
  • Docker Hub 镜像加速器

    国内从 Docker Hub 拉取镜像有时很慢 xff0c 此时可以配置镜像加速器 Docker 官方和国内很多云服务商都提供了国内加速器服务 版本号 Ubuntu 16 04 43 Debian 8 43 CentOS 7 43 配置加速
  • FFmpeg将多张图片合成视频

    FFmpeg将多张图片合成视频从不同目录下多张图合成视频 PipeConcat 容易误解的几个命令 FFmpeg将多张图片合成视频 首先要计算出视频的总帧数 xff1a 总帧数 61 duration fps duration是我们设定的视
  • 程序员读书啦!!!

    成为Java顶尖程序员 xff0c 看这11本书就够了 xff1a http blog csdn net u012410733 article details 51869105 编程科普书籍推荐 xff1a http blog csdn n
  • win10系统隐藏u盘EFI分区的方法

    打开cmd或powershell xff0c 按如下命令行操作 xff08 以powershell示例 xff0c 及后面文字为注释内容不需要输入 xff09 xff1a diskpart 运行diskpart工具 lis dis 列出所有
  • hisat2-build

    The hisat2 build indexer 使用dna文件构建索引 xff0c 输出后缀为 1 ht2到 8 ht2的八个文件 如果索引较大 xff0c 后缀改为ht2l 后续的比对需要这八个文件 xff0c 并且一旦索引构建成功 x
  • Apache Tomcat 8.0.9下载、安装、配置和部署(不是最新版本)

    下载Apache Tomcat 8 0 9 登陆Apache Tomcat官网http tomcat apache org 找到左边导航栏的Download目录下的Tomcat 8 0 点击进去之后选择Quick Navigation下的A
  • BeautifulSoup

    代码 xff1a from bs4 import BeautifulSoup 一个html格式的内容 doc 61 39 lt html gt lt head gt lt title gt Page title lt title gt lt
  • Failed to download repository information Software Updater 解决

    今天在更新系统软件时打开Software Updater 遇到了Failed to download repository information 的错误 解决办法 在terminal 中输入 sudo apt span class tok

随机推荐