数据结构 图的邻接矩阵

数据结构 图的邻接矩阵图的邻接矩阵的存储方式是用两个数组来实现的,一个一维数组存储顶点信息,一个二维数组存储线(无向图)或弧(有向图)的信息。设图G有n个顶点,则邻接矩阵是一个n×n的方阵,定义为:无向图的邻接矩阵,两个顶点有边则为1,否则,为0;因为是无向图arc[i][j]=arc[j][i],所以矩阵为对称矩阵,对角线为自己到自己的边,邻接矩阵中,行之和或者列之和都为各顶点度的总数。设图G有是网图,有n个…

大家好,又见面了,我是你们的朋友全栈君。

图的邻接矩阵的存储方式是用两个数组来实现的,一个一维数组存储顶点信息,一个二维数组存储线(无向图)或弧(有向图)的信息。

设图G有n个顶点,则邻接矩阵是一个n × n的方阵,定义为:

数据结构 图的邻接矩阵

数据结构 图的邻接矩阵

无向图的邻接矩阵,两个顶点有边则为1,否则,为0;因为是无向图arc[i][j] = arc[j][i],所以矩阵为对称矩阵,对角线为自己到自己的边,邻接矩阵中,行之和或者列之和都为各顶点度的总数。

设图G有是网图,有n个顶点,则邻接矩阵是一个n × n的方阵,定义为:

数据结构 图的邻接矩阵

数据结构 图的邻接矩阵

无向网图和无向图差不多,就是加了权值,两个顶点之间无边的话距离是∞。

如果是有向图,邻接矩阵就不是对称矩阵了。

下面是邻接矩阵的存储结构:

#define MAXVERTEX 100   //图的最大顶点数
#define INFINITY 32767  //用有符号的int最大值表示无穷大
typedef char vertextype;    //定义定点的存储信息为字符型
typedef int arctype;    //定义边的权值为int型

//图的邻接矩阵的存储结构
typedef struct
{
    vertextype vertex[MAXVERTEX];   //顶点表
    arctype arc[MAXVERTEX][MAXVERTEX];  //邻接矩阵
    int vertexnum;  //图的当前顶点数
    int arcnum; //图的当前边数
}MGraph;

存储结构里面主要由四部分构成,

第一部分是一个一维数组存储的是顶点信息,

第二部分是邻接矩阵由二维数组组成,存储着各顶点彼此之间的关系,

第三部分和第四部分分别是当前图的顶点数和线数。

下面是具体的代码实现(注释的很详细了):

#include <iostream>
using namespace std;

#define MAXVERTEX 100   //图的最大顶点数
#define INFINITY 32767  //用有符号的int最大值表示无穷大
typedef char vertextype;    //定义定点的存储信息为字符型
typedef int arctype;    //定义边的权值为int型

//图的邻接矩阵的存储结构
typedef struct
{
    vertextype vertex[MAXVERTEX];   //顶点表
    arctype arc[MAXVERTEX][MAXVERTEX];  //邻接矩阵
    int vertexnum;  //图的当前顶点数
    int arcnum; //图的当前边数
}MGraph;

//创建无向网
void CreateMGraph(MGraph &G)
{
    cin >> G.vertexnum; //输入顶点数目
    cin >> G.arcnum;    //输入边数
    for(int i = 0; i < G.vertexnum; i++)    //输入顶点信息
        cin >> G.vertex[i];
    for(int i = 0; i < G.vertexnum; i++)    //将所有边初始化为无穷大
        for(int j = 0; j < G.vertexnum; j++)
            G.arc[i][j] = INFINITY;
    for(int k = 0; k < G.arcnum; k++)
    {
        int i, j, w;
        cin >> i >> j;  //输入构成边的两个顶点
        cin >> w;   //输入边所对应的权值
        G.arc[i][j] = w;
        G.arc[j][i] = G.arc[i][j];  //无向图的邻接矩阵为对称矩阵
    }
}

//打印邻接矩阵
void PrintfMGraph(MGraph G)
{
    for(int i = 0; i < G.vertexnum; i++)
    {
        for(int j = 0; j < G.vertexnum; j++)
            cout << G.arc[i][j] << '\t';
        cout << endl;
    }
}

//主函数
int main()
{
    MGraph G;
    CreateMGraph(G);
    PrintfMGraph(G);
    return 0;
} 

邻接矩阵的时间复杂度为O(n +  n^2 + e),其中n为顶点数,e为边数,去掉低阶和系数后,变为O(n^2)。

运行结果(根据上面第二个图输入的数据):

数据结构 图的邻接矩阵

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/153994.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 爬虫系列,(3),达盖尔图片抓取

    爬虫系列,(3),达盖尔图片抓取importreimportrequestsfrombs4importBeautifulSoup#第一步得到代理defproxy():withopen(r’ip_proxies\有效ip.txt’,’r’,encoding=’utf-8′)asf:r=f.readlines()foripinr:…

    2022年6月24日
    30
  • Linux中断 – 综述

    Linux中断 – 综述

    2022年3月13日
    29
  • K3 官改新手小白配置阿里DDNS 超级详细「建议收藏」

    K3 官改新手小白配置阿里DDNS 超级详细「建议收藏」K3官改新手小白配置阿里DDNS超级详细写的比较仓促,不对之处请指正,这个是写给小白看的,大神勿喷首先介绍一下什么是DDNSDDNS(DynamicDomainNameServer)是动态域名服务的缩写。DDNS是将用户的动态IP地址映射到一个固定的域名解析服务上,用户每次连接网络的时候客户端程序就会通过信息传递把该主机的动态IP地址传送给位于服务商主机上的服务器程序,服务器…

    2022年6月12日
    42
  • navicat for mysql 15.4 激活码_通用破解码

    navicat for mysql 15.4 激活码_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    151
  • 开启QQ登录保护仍被盗号——QQ安全机制全面分析[通俗易懂]

    开启QQ登录保护仍被盗号——QQ安全机制全面分析[通俗易懂]1、前言周围总是有些同学QQ被盗号,攻击者盗取账号后会继续去欺骗列表里的好友,形成链式反应。危害比较大。腾讯QQ安全中心提供了登录保护机制,如图:  这是腾讯为QQ添加第二层保护,在开启登录保护后,盗号者偷走密码的情况下QQ仍然安全。即使你的账号密码不小心泄露了,盗号者仍旧无法登录你的QQ。  但是,有位同学在开启QQ登录保护的情况下依然被盗号者登录成功了。QQ登录保护的安全机制:当我们开启了“登录保护”,盗号者登录QQ输入正确的密码,即使更换IP骗过了安全检测系统,会发现仍然需要

    2022年6月22日
    308
  • 稳定性测试怎么做_stata稳定性检验怎么做

    稳定性测试怎么做_stata稳定性检验怎么做稳定性对产品的重要性不言而喻。而作为质量保障,在稳定性测试方面的探索也在不断演化。记得两年前我们做稳定性测试还是基于恒定的压力,7*24小时长时间运行,关注的指标无非是吞吐量TPS的抖动、响应时间的变化趋势,以及各种资源是否泄露。稳定性测试的场景设计简单,和线上实际运行有较大的出入。带来的直接结果是稳定性测试发现的问题比较有限,做完之后仍然没有特别大的信心。图片那稳定性测试究竟该如何做?别人在怎么做?性能测试组今年在这方面做了一些思考和改进,虽然称不上很好的解决方案,但是通过努力比以前的做法还是有不少

    2022年9月9日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号