存储图的信息时,一般需要存储的是边的信息。
边的信息:两个结点,权值
一般的方式包含:邻接矩阵、邻接表
通常而言邻接表是指的用链表实现的。但是链表存在的问题是非常容易出错。
所以在邻接表的思想上使用了vector存储和链式前向星
模板代码:
int cnt=0; int head[N];//链式前向星 struct st{ int from,to,next,dis; }edge[N*N]; //这里实际存储的是有向边,如果存储无向边时,可以addedge(u,v,w);addedge(v,u,w); //所以存储无向边时,edge数组的大小是图的边数*2 void addedge(int u,int v,int w){//链式前向星添加边。其实就是一个数组模拟链表,并且新加的边都放在了结点头之后 cnt++; edge[cnt].from=u;//有向边的开始结点 edge[cnt].to=v;//有向边的结束结点 edge[cnt].dis=w;//有向边的权值 edge[cnt].next=head[u];//将这条有向边直接放在头结点head[u]之后 head[u]=cnt;//更改头结点,此时头结点的后面已经改变了 } //遍历结点u所连的边时 for(int i=head[u];i;i=edge[i].next){ int v=edge[i].to;//u所连的边的另一个结点 int w=edge[i].dis;//这条边的权值 int ne=edge[i].next;//因为是基于链表的思想,所以next存储的下一条u开始的边的编号(也就是edge[]的下标) }
一般而言链式前向星是最好的存储图的方式,比vector稍微好一点。只要出题者不故意卡,vector就可以通过。
写于:2020/8/11 10:50