邻接矩阵 V.S. 邻接表

一.邻接矩阵

    用二维数组存储,所以空间有限,大数据就存不下啦。

    我们先定义个二维数组mp[][]

    规定mp[i][0]为i连出去的边的个数

    从mp[i][1] 到 mp[i][mp[i][0]] 记录mp[i][0]个点

    添加边的函数如下:

void add_e(int x, int y)
{
    mp[x][++mp[x][0]] = y; //从1开始
}

    若有边权,就在定义一个二位数组w[][]记录

    函数如下:

void add_e(int x, int y, int z) //z到y有一条权值为z的边
{
    mp[x][++mp[x][0]];    //从1开始
    mp[x][mp[x][0]]
}

     邻接矩阵的调用:

for(int j = 1; j <= mp[x][0] j++)
{
    ;;;;;    //就可以调用mp[x][j]啦
}

二.邻接表

    可以省出很多空间(毕竟用的都是一维的),但需要四个数组,且理解起来起来比邻接矩阵要麻烦。

    邻接表 套装 请查收:

//E:边Edge, D:点Dot
int son[E];    //边 指向的 点
int w[E];      //边 权
int nxt[E];    //边 指向的前一个 边
int lnk[D];    //点 指向的最后一个 边
int cnt = 0;   //边的序号,关于一个点会比较乱

    备足装备,我们就要开始挂链表了前方高能

void add_e(int x, int y, int z) //x到y有一条权值为z的边
{
    son[++cnt] = y;      //cnt这条边的儿子是y(指向y)
    w[cnt] = z;          //权值加入
    nxt[cnt] = lnk[x];   //注意不要弄反了 先让cnt这条边指向x伸出的最后一条边
    lnk[x] = cnt;        //注意不要弄反了 然后cnt自己变成了x伸出的最后一条边
}

    调用就更简单了:

for(int j = lnk[x]; j; j = nxt[j]) //只要j不为空,就一直做。
                                   //边j 指向 边j 前一条边 直到就不存在了
{
    ;;;;;    //然后你要干什么就自己添加吧~
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值