邻接矩阵实现图的存储

目录

一. 前言

二. 用邻接矩阵来实现图的存储


一. 前言

1. 图的定义

        所谓图就是包含顶点和边的集合,是一种多对多的关系。用符号表示为:G=(V,E)。其中,V代表顶点(数据元素)的有穷非空集合,E代表边的有穷集合。也就是说一个图可以没有边,但顶点不能没有。

2. 有向图和无向图

        顶点之间靠一个带有方向的弧连接的图就叫有向图,无向图则相反,边并没有方向。

3. 完全图

        任意两个点都有一条边相连的图。如下所示:

4.稀疏图和稠密图

        稀疏图就是有很少边或弧的图。而稠密图则是有较多边和弧的图。

5. 权和网

        图中边或弧所具有的相关数称为权。表明从一个顶点到另外一个顶点的距离或耗费。而网就是边或者弧带权的图,也就分为无向网和有向网。

6.连通图(强连通图)

        在无(有)向图G中,若对任何两个顶点v,u都存在从v到u的路径,则称G是连通图(强连通图)。

7. 连通分量(强连通分量)

        无向图(有向图)的极大连通子图称为G的连通分量(强连通分量)。其中,极大连通子图的含义为:该子图是G连通子图,但如果将G的任何不在该子图中的顶点加入,那么这个子图将不再连通,我们就称这样的连通子图为极大连通子图。

8. 极小连通子图

        该子图是G的连通子图,在该子图中删除任何一条边,子图不再连通。

9. 邻接矩阵

        所谓邻接矩阵,拿无向图来举例,就如下所示:

因为v1和v2是相连的,并且这是一个无向图,并没有权值。所以就在v1行v2列的数字为1。邻接矩阵中为0的地方,就代表那两个顶点并没有直接相连。

如果是无向网(表示有权值的图),就不是在相连的地方赋值1了,而是赋值这两个顶点所连边的权值。如下所示:

 

二. 用邻接矩阵来实现图的存储

        我们上面知道了这个存储结构的原理之后,就可以考虑用代码来实现了。用邻接矩阵来创建一个无向图的代码如下所示:

#include<iostream>
using  namespace std;

#define MAXnum 100

//邻接矩阵的结构类型定义
typedef struct{
    char vexs[MAXnum];    //定义一个数组存放顶点,作为顶点表
    int arcs[MAXnum][MAXnum];    //邻接矩阵
    int vexnum,arcnum;    //图当前的顶点数和边数
}AMGraph;    //Adjacency Matrix Graph

int LocateGraph(AMGraph G,char c);

int Create(AMGraph &G){
    cout<<"请输入总的顶点数和边数(中间用空格隔开):";    
    cin>>G.vexnum>>G.arcnum;    //先输入总的顶点数和边数
    
    for(int i=0;i<G.vexnum;i++){    //依次输入顶点信息,有几个顶点就输入几个
        cout<<"请输入顶点信息(顶点名称):";
        cin>>G.vexs[i];
    }
    
    //接着给所有的边的权值赋一个最大值
    for(int i=0;i<G.vexnum;i++){
        for(int j=0;j<G.vexnum;j++){
            G.arcs[i][j]=65536;
        }
    }
    
    //开始录入边的信息
    for(int i=0;i<G.arcnum;i++){
        char v1;    //用这两个变量来接收两个顶点的值
        char v2;
        int w;    //接收权值
        cout<<"请输入其中一条边两边的顶点和权值:";
        cin>>v1>>v2>>w;
        int n=LocateGraph(G,v1);    //通过这个函数来获取这两个顶点在顶点表中的序号
        int m=LocateGraph(G,v2);
        G.arcs[n][m]=w;    //给邻接矩阵重新赋值
        G.arcs[m][n]=w;
    }
return 1;
}

int LocateGraph(AMGraph G,char c){
    for(int i=0;i<G.vexnum;i++){
        if(G.vexs[i]==c) return i;
    }
    return -1;
}

int main(){
    AMGraph G;
    Create(G);    //这里我们在创建好了我们想要的邻接矩阵之后就可以进行相关操作
    cout<<G.vexs[1];    //比如我这里进行一个小测试,让它输出我们的第二个顶点名称,看是否是我们所创建的邻接矩阵
}
        
        

这里我们举了如何用邻接矩阵来实现无向网,我们要是想要用邻接矩阵来创建无向图的话,首先就得初始化邻接矩阵的权值都为0,如果有相连的再赋值为1。只需要在上面代码的基础上修改这部分的内容就行。如下所示为修改之后的部分代码(其他代码一样):

for(int i=0;i<G.vexnum;i++){
    for(int j=0;j<G.vexnum;j++){
        G.arcs[i][j]=0
    }
}
G.arcs[n][m]=1;
G.arcs[n][m]=1;

下面我们继续看看用邻接矩阵来实现有向图跟有向网,因为无向图的邻接矩阵是对称的,所以上面的代码就得出现这样的代码:

G.arcs[n][m]=w;
G.arcs[m][n]=w;

但在我们有向图中就不再需要这样了,只需要上面一行代码就行了。也就是G.arcs[n][m]=w;就够了。并且跟上面无向图一样,相连顶点的边权值为1。 

 

 

 

 

  • 30
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值