Ⅰ 关于数据结构中图的储存方式的选择
首先你要明白,邻接链表存图的空间复杂度与图中边的数量有关(O(N+E) E表示图中边的数目),而数组存图空间复杂度与点数有关(O(N^2)N表示点数)
看点的数量,如果点的数量不是很大(比如几百个左右或者更小)那么二者都可以选择。
如果点的数量过大的话,用数组存储稀疏图会造成大量的空间浪费,此时选择使用邻接表更好。
Ⅱ 图的邻接表存储结构 表头结点后面跟的邻接结点的排列先后顺序有要求吗
可以,这个没有什么区别。
四种表示图的方法:
1.邻接矩阵
2.邻接表
3.邻接多重表
4.十字链表
Ⅲ 已知有向图的邻接表存储结构如下图所示
深度优先是从某个顶点出发,访问完后,寻找一个未访问的邻接顶点继续深度优先,如果此路不同就往回退,所以看邻接表,首先访问V1,完了后顺链寻找没有访问的邻接顶点,自然链表中的第一个结点就是v3,接着转到v3再来深度优先,访问v3后,在其链表中第一个邻接顶点是v4
接着访问v4,下面走不通,回到v3,继续顺链往后,自然是v5,v5的邻接顶点中v2还没有访问
所以序列为v1, v3, v4, v5, v2
再看广度优先,从某个顶点完成后,需要一口气将其邻接未访问的所有顶点都访问,后面类推
于是过程是先v1,再顺链将v3,v2依次访问完,然后再依次访问v3和v2的各个未访问邻接顶点,v3链表中顺链可以访问v4,v5,所以最后访问序列为v1, v3, v2, v4, v5
Ⅳ 无向图的邻接表存储方式和深度优先遍历的方法(代码)
type
node=record
y:longint;
flag:boolean;
next:longint;
p:-1..1;
end;
var
n,m,i,j,x,y:longint;
map:array [0..40000] of node;
a:array [0..40000] of longint;
procere dfs(i:longint);
var
j:longint;
begin
j:=a[i];
while j>-1 do begin
if map[j].flag then begin
map[j].flag:=false;
map[j xor 1].flag:=false;
if map[j].p>-1 then begin
map[j].p:=0;
writeln(i);
dfs(map[j].y);
map[j].p:=1;
end;
end;
j:=map[j].next;
end;
end;
begin
readln(n,m);
for i:=1 to n do a[i]:=-1;
for j:=1 to m do begin
readln(x,y);
map[2*j-2].y:=y;
map[2*j-2].next:=a[x];
map[2*j-2].flag:=true;
a[x]:=2*j-2;
map[2*j-1].y:=x;
map[2*j-1].next:=a[y];
map[2*j-1].flag:=true;
a[y]:=2*j-1;
end;
map[a[1]].p:=0;
dfs(1);
map[a[1]].p:=1;
end.
Ⅳ 邻接表存储时,空间复杂度O( n+e),还是O(n)
O(n+e),取n次最小权,每次取完会进行n次更新。如果能达到o(n+e),就不需要O(n)。
在有向图中,描述每个点向别的节点连的边(点a->点b这种情况)。在无向图中,描述每个点所有的边。与邻接表相对应的存图方式叫做边集表,这种方法用一个容器存储所有的边。
对于有向图,vi的邻接表中每个表结点都对应于以vi为始点射出的一条边。因此,将有向图的邻接表称为出边表。
(5)与图的邻接表存储方式相比扩展阅读:
n个顶点e条边的有向图,它的邻接表表示中有n个顶点表结点和e个边表结点。(因为有向图是单向的)
在有向图中,为图中每个顶点vi建立一个入边表的方法称逆邻接表表示法。入边表中的每个表结点均对应一条以vi为终点(即射入vi)的边。
n个顶点e条边的有向图,它的逆邻接表表示中有n个顶点表结点和e个边表结点。
Ⅵ 图的邻接矩阵和邻接表的存储结构各有什么特点
图的邻接表数据类型描述如下:
const int N=maxn; // maxn表示图中最大顶点数
const int E=maxe ; // maxe图中最大边数
struct Edge{
int u,v; //边所邻接的两个顶点
int w; //边的权值
int next; //边指针,指向下一条边的内存池地址
}edge[E]; // 静态内存池,用于分配边
int head[N]; // 表头
int num; // 内存池的指针
Ⅶ 在线急求熟悉图的两种常用的存储结构,邻接矩阵和邻接表。
#include<stdio.h>
#include<malloc.h>
#define NULL 0
#define maxvernum 100
typedef struct node
{
int adjvex;
struct node *next;
}nodetype;
typedef struct frontnode
{
int data;
struct node *next;
}frontnodetype;
frontnodetype adjlist[maxvernum];
/*********************************************/
void main()
{
void bfs(frontnodetype g[],int v,int c[]);
void travelgraph(frontnodetype g[],int n);
frontnodetype adjlist[6];
int i,j,m;
for(i=1;i<=5;i++)
{
adjlist[i].data=i;
adjlist[i].next=NULL;
}
for(j=1;j<=5;j++)
{
printf("进入第%d次循环\n",j);
printf("开始输入前请输入一个不为0的m值以便输入\n");
scanf("%d",&m);
while(m!=0)
{
int x;
printf("请输入结点序号(x=0表示后面没有结点):\n");
if(x!=0)
{
scanf("%d",&x);
nodetype *p;
p=(nodetype *)malloc(sizeof(nodetype));
p->adjvex=x;p->next=NULL;
p->next=adjlist[j].next;
adjlist[j].next=p;
}
else break;
printf("是否停止?(m为0时停止输入,m为1时继续输入。)\n");
scanf("%d",&m);
}
}
printf("广度优先搜索序列为:\n");
travelgraph(adjlist,5);
}
/************************************************/
void bfs(frontnodetype g[],int v,int c[])
{
int q[6],r=0,f=0;
nodetype *p;
c[v]=1;
printf("%d\n",v);
q[0]=v;
whille(f<=r)
{
v=q[f++];
p=g[v].next;
while(p!=NNLL)
{
v=p->adjvex;
if(c[v]==0)
{
c[v]=1;
printf("%d\n",v);
}
p=p->next;
}
}
}
/************************************************/
void travelgraph(frontnodetype g[],int n)
{
int v;
int c[6];
for(v=1;v<=n;v++)
c[v]=0;
for(v=1;v<=n;v++)
if(c[v]==0)
dfs(g,v,c);
}
Ⅷ 无向连通图的邻接表的存储
最近在看这部分,可惜没记住无向连通图邻接表的定义。
你的程序,我看看出了1点问题:
1、typedef struct ArcNode{ //边(表结点)
int adjvex; //该弧所指向的顶点的位置
struct ArcNode *nextarc; //指向下一条弧的指针
int info; //该弧相关信息的指针
};
缺东西呢,typedef 是要给 struct ArcNode 起个别名,但是你并没有做。
可改成 typedef struct ArcNode {.....} ArcNode, *pArcNode; 之类的。或者把 typedef 去了
===============================================
void buildhead(ALGraph &G) //创建一个头结点表
{
int i=65;
while(i < G.vernum+65)
{
G.vertices[i].data = (char)i;
G.vertices[i].firstarc->nextarc=NULL;
i++;
} // 这个过程为什么要从65 开始呢?不是最大有20个节点吗?G.vernum的下标应该是 0 - 19 猜对吧?
}
Ⅸ 一个单循环链表改写为双循环链表算法和按图的邻接表存储方式给出图的深度优先算法dsf求助,着急啊!!
sdgsa
Ⅹ 在有向图的邻接表和逆邻接表两种存储中,那种便于顶点出度计算
逆邻接表。所谓逆邻接表就是在有向图的邻接表中,对每个顶点链接的是指向该顶点的边。表结点中顶点v出现的次数就是该顶点v的出度。