chapter §17 图的邻接矩阵表示

图(Graph)是由顶点的有穷非空集合和顶点之间的边的集合组成,通常表示为G(V,E),其中,G指的是一个图,V指的是G中顶点的集合,E指的是G中边的集合。

一、图的定义

包含边表和顶点表。一维数组反映顶点信息,二维数组反映顶点之间的关系,即边或弧的信息。

const int MaxVertexNum = 100;//最大顶点数
const int INFINITY = 65535;//表示无穷,即两个点顶点之间不存在边
typedef char VertexType;//顶点类型
typedef int EdgeType;//边上权值类型
typedef struct {
    VertexType Vretex[MaxVertexNum];//顶点表
    EdgeType Edge[MaxVertexNum][MaxVertexNum];//邻接矩阵,边表
    int VertexNum, EdgeNum; //顶点数,边数
} MGraph;//M指Matrix,意为矩阵

二、图的邻接矩阵存储

用两个数组来表示一个图,一维数组Vertex存储顶点信息,二维数组Edge存储边的信息。Edge数组中具体值表示顶点Vi到顶点Vj之间的边的权值,若为无穷,则两顶点之间无边,也可认为不可达。有无向图的特性可知,其邻接矩阵为对称矩阵。

1、创建无向图,用邻接矩阵存储
MGraph CreateUndirectedMGraph(MGraph &G) { //创建无向图
    cin >> G.VertexNum >> G.VertexNum;//输入顶点和边的个数
    for (int i = 0; i < G.VertexNum; ++i) {//读入顶点,建立顶点表
        cin >> G.Vretex[i];
    }
    for (int i = 0; i < G.VertexNum; ++i) {//初始化邻接矩阵,即各顶点之间初始不可达
        for (int j = 0; j < G.VertexNum; ++j) {
            G.Edge[i][j] = INFINITY;//距离设为无穷
        }
    }
    for (int k = 0; k < G.EdgeNum; ++k) { //读入各边
        int i, j;//表示与边(Vi,Vj)相连的两个顶点下标i,j
        EdgeType weight;//边上权重
        cin >> i >> j >> weight;
        G.Edge[i][j] = weight;//保存权值
        G.Edge[j][i] = G.Edge[i][j];//无向图的邻接矩阵对称
    }
    return G;
}
2、创建有向图,用邻接矩阵存储
MGraph CreateDirectedMGraph(MGraph &G) { //创建有向图
    cin >> G.VertexNum >> G.VertexNum;//输入顶点和有向边的个数
    for (int i = 0; i < G.VertexNum; ++i) {//读入顶点,建立顶点表
        cin >> G.Vretex[i];
    }
    for (int i = 0; i < G.VertexNum; ++i) {//初始化邻接矩阵,即各顶点之间初始不可达
        for (int j = 0; j < G.VertexNum; ++j) {
            if (i == j) G.Edge[i][j] = 0;//顶点到自身权值设为0
            else G.Edge[i][j] = INFINITY;//距离设为无穷
        }
    }
    for (int k = 0; k < G.EdgeNum; ++k) { //读入各有向边
        int i, j;//表示与边<Vi,Vj>相连的两个顶点下标i,j,由Vi->Vj
        EdgeType weight;//边上权重
        cin >> i >> j >> weight;
        G.Edge[i][j] = weight;//保存权值
    }
    return G;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Missヾaurora

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值