一.邻接矩阵
用二维数组存储,所以空间有限,大数据就存不下啦。
我们先定义个二维数组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 前一条边 直到就不存在了
{
;;;;; //然后你要干什么就自己添加吧~
}