存图

有向图,无向图

通常用邻接矩阵存,也可以拓展为存权值,无向图是对称矩阵

简单好写,查找速度快,但空间复杂度太高

于是引出邻接表

struct Edge
{
    int to, w;
};

由于只关注从该点起,能连接到哪个点,所以邻接表中的节点顺序无意义

STL里的vector容器,作为动态数组,既拥有链表节省内存的优点,但又可以以类似数组的方式访问,而且写法也很简便。

std::vector<Edge> edges[MAXN];
inline void add(int from, int to, int w)
{
    Edge e = {to, w};
    edges[from].push_back(e);  //向vector的最后添加一条边
}

链式前向星:通俗上来说,用数组模拟链表,其常数更大,但是写法更为复杂

struct Edge
{
    int to, w, next;
}edges[MAXM];
int head[MAXN], cnt; // cnt为当前边的编号
inline void add(int from, int to, int w)
{
    edges[++cnt].w = w;    //新增一条编号为cnt+1的边,边权为w
    edges[cnt].to = to;    //该边的终点为to
    edges[cnt].next = head[from];  //把下一条边,设置为当前起点的第一条边
    head[from] = cnt;  //该边成为当前起点新的第一条边
}

我们为每条边额外储存一个属性next,并赋予每条边一个编号。head数组则用于储存每个起点对应的第一条边。

存图过程:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值