图的基础:存图

存储图的信息基本有3种方法

1:邻接矩阵

使用一个n*n的二维数组,a[i][j]表示结点i到结点j之间存在一条边。临街矩阵既可以存储有向图,也可存储无向图,既可以只是单纯的表示两个结点之间是否连通,也可以表示含有权值的图。无向图存储的只是需要记住a[i][j]=a[j][i]就可以了

优点:便于理解,便于书写代码

缺点:空间、时间复杂度比较高,一般适用于稠密图

2:邻接表

为图的每一个结点建立一个链表,链表中的值表示与这个结点相连的节点的信息。

优点:便于理解,时间空间复杂度较低

缺点:写一个单纯的链表,设计指针,容易写错

所以邻接表的思想一般使用vector可变数组来实现

3:链式前向星

其实也是一个邻接表的表示方法,不过时间和控件复杂度会稍微好点

int head[N],cnt=0;
struct edge{
    int from,to,next,dis;
}edge[N];
void addedge(int u,int v,int w){
    cnt++;
    edge[cnt].from=u;//表明这条边的来向
    edge[cnt].to=v;//表明这条边的去向
    edge[cnt].next=head[u];//表明这条边的下一条边(都是与u相连的边)
    head[u]=cnt;//改变u结点的第一个边
    //相当于原先是head[u]->v1,现在插入一条(u,v2)的边,变为head[u]->v2->v1 
}

写于2020/8/8 23:23

 

posted @ 2020-08-08 23:24  白菜茄子  阅读(472)  评论(0编辑  收藏  举报