【小白日记】C语言实现最小代价生成树,并测试算法其时间复杂度(day 1)

一、图的存储结构

1、谈谈邻接矩阵(adjacency matrix)

邻接矩阵表示顶点之间的相邻关系。举个例子,一个有n个顶点的图 G=(V,E) 的邻接矩阵是一个 n×n 的矩阵 A , A 中的每个元素都只能是 0 或 1 ,比如说 A[ i ][ j ] = 0 表示第 i 个元素没有指向第 j 个元素的边(< i , j > 不属于 E ) A[ i ][ j ] = 1 则代表相反的情况。(很显然 i , j 都小于 n )

以上的这种邻接矩阵只能表示不带权值的有向图,试想一下,如果 G 是一个带权的无向图(以下称为“”),那么将 G 表达为 G=(V,E,W),设定:如果 < i , j >或< j , i > 属于 E (即网中第 i 个元素和第 j 个元素之间有边), 那么 A[ i ][ j ] = A[ j ][ i ] = w ( i , j ) = w ( j , i )(PS:w ( i , j ) 表示第 i 个元素和第 j 个元素边的权值)(我们将 < i , i > 的情况全部划入 E 中,且规定 A[ i ][ i ] = 0);如果 < i , j > 或者 < j , i > 不属于 E ,那么我们规定 A[ i ][ j ] = A[ j ][ i ] = ∞ 。

下面我们给出以邻接矩阵作为存储表示的网的 C 语言类型定义:

typedef struct graph{

    int Vertices;//网中的顶点数

    T**A;//指向存储邻接矩阵的二维数组的指针

}Graph;

接着我们建立邻接矩阵:

void CreateGraph(Graph*g, int n)
{
    int i,j;
    g->Vertices=n;
    g->A=(T**)malloc(n*sizeof(T*));//建立(申请空间)以一维数组为元素的一维数组
    for(i=0;i<n;i++)
    {
        g->A[i]=(T*)malloc(n*sizeof(T));//建立一维数组
        for(j=0;j<n;j++)
            g->A[i][j]=INF;//初始化,所有数组元素设置为无穷大,代表此时图中不存在边
        g->A[i][i]=0;//初始化,对角线上的元素置零
    }

}


2、对网进行操作

现在我们通过建立邻接矩阵描述了网中点和边的关系,将抽象的网概念表达出来,但目前我们的网中还没有“边”,点与点之间没有建立起联系。因此接下来我们要做的就是设计出边的插入运算:

void Add(Graph*g,int i,int j,T w)
{
    if(g->A[i][j]=INF&&g->A[j][i]=INF)//若 i 到 j  无边则建立联系赋予权值,避免重复输入。
    {
        g->A[i][j]=w;
        g->A[j][i]=w;
    }
}

由于我们还有一个目的,希望测试出实现最小生成树算法的时间复杂度,所以我们需要大量不同的网,通过人工的方式给网赋值显然工作量巨大,并不明智。因此我们采用随机赋值的方法来得到这些网:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值