图的邻接表存储方式Word格式文档下载.docx
- 文档编号:18377859
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:10
- 大小:81.18KB
图的邻接表存储方式Word格式文档下载.docx
《图的邻接表存储方式Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《图的邻接表存储方式Word格式文档下载.docx(10页珍藏版)》请在冰豆网上搜索。
a:
array[1..maxv]ofpoint;
而用数组实现邻接表,则需要定义两个数组:
一个是顶点数组,一个是边集数组。
顶点编号
结点相临边的总数s
第一条邻接边next
此边的另一邻接点
边权值
下一个邻接边
对于上图来说,具体的邻接表就是:
由上图我们可以知道,和编号为1的顶点相邻的有3条边,第一条边在边集数组里的编号是5,而和编号为5同一个顶点的下条边的编号为3,再往下的边的编号是1,那么和顶点1相邻的3条边的编号分别就是5,3,1。
同理和顶点3相邻的3条边的编号分别是11,8,4。
如果理解数组表示邻接表的原理,那么实现就很容易了。
类型定义如下:
node=record//点集数组
s,next:
longint;
//s为与第i个点相临的边有多少个,next为第一条边的编号为多少?
edge=record//边集数组
y,v,next:
//y为这条边的另一个顶点,v为权值,next为和第i个节点相临的另一条边,next为0则表示结束。
var
array[1..maxn]ofnode;
e:
array[1..maxm]ofedge;
见图的代码和动态邻接表类似:
readln(x1,y1,v1);
inc(m);
e[m].y:
=y1;
e[m].v:
=v1;
e[m].next:
=a[x1].next;
a[x1].next:
=m;
inc(a[x1].s);
=x1;
=a[y1].next;
a[y1].next:
inc(a[y1].s);
下面提供一道例题
邀请卡分发deliver.pas/c/cpp
【题目描述】
AMS公司决定在元旦之夜举办一个盛大展览会,将广泛邀请各方人士参加。
现在公司决定在该城市中的每个汽车站派一名员工向过往的行人分发邀请卡。
但是,该城市的交通系统非常特别,每条公共汽车线路都是单向的,且只包含两个车站,即起点站与终点站,汽车从起点到终点站后空车返回。
假设AMS公司位于1号车站,每天早上,这些员工从公司出发,分别到达各自的岗位进行邀请卡的分发,晚上再回到公司。
请你帮AMS公司编一个程序,计算出每天要为这些分发邀请卡的员工付的交通费最少为多少?
【输入文件】
输入文件的第一行包含两个整数P和Q(1<
=P<
=10000,0<
=Q<
=20000)。
P为车站总数(包含AMS公司),Q为公共汽车线路数目。
接下来有Q行,每行表示一条线路,包含三个数:
起点,终点和车费。
所有线路上的车费是正整数,且总和不超过1000000000。
并假设任何两个车站之间都可到达。
【输出文件】
输出文件仅有一行为公司花在分发邀请卡员工交通上的最少费用。
【样例输入】
Case1:
22
1213
2133
Case2:
46
1210
2160
1320
3410
245
4150
【样例输出】
Case1:
46
210
【分析】此题是一道基本最短路径问题,但是如果想通过全部数据,10000个点,20000条边,必须用邻接表来实现。
下面给出此题目用dijkstra和spfa两种算法的实现。
programdelive_dijstrkalr;
const
inf='
deliver.in'
;
ouf='
deliver.out'
maxm=20000;
maxn=10000;
type
//s为与第i个点相临的边有多少个,next为第一条边的编号为多少?
edge=record
i,j,k,m,n,x1,y1,w1,ans:
a,a1:
e,e1:
d,d1:
array[1..maxn]oflongint;
proceduredij;
i,j,k,min,jj,kk:
f:
array[1..maxn]ofboolean;
begin
fillchar(d,sizeof(d),$7f);
fillchar(f,sizeof(f),false);
j:
=a[1].next;
fori:
=1toa[1].sdo
k:
=e[j].y;
d[k]:
=e[j].v;
=e[j].next;
//用邻接表来找和第1个点相临的点,并给d数组赋初值。
。
f[1]:
=true;
d[1]:
=0;
=2tondo
min:
=maxlongint;
forj:
=1tondo
if(notf[j])and(d[j]<
min)then
=d[j];
=j;
ifk=0thenexit;
f[k]:
jj:
=a[k].next;
=1toa[k].sdo
kk:
=e[jj].y;
if(notf[kk])and(d[k]+e[jj].v<
d[kk])then
d[kk]:
=d[k]+e[jj].v;
=e[jj].next;
//邻接表的使用,要好好注意。
assign(input,inf);
reset(input);
assign(output,ouf);
rewrite(output);
fillchar(a,sizeof(a),0);
fillchar(e,sizeof(e),0);
fillchar(a1,sizeof(a1),0);
fillchar(e1,sizeof(e1),0);
readln(n,m);
=1tomdo
readln(x1,y1,w1);
e[i].y:
e[i].v:
=w1;
e[i].next:
=i;
e1[i].y:
e1[i].v:
e1[i].next:
=a1[y1].next;
a1[y1].next:
inc(a1[y1].s);
dij;
d1:
=d;
=a1;
=e1;
ans:
=ans+d[i]+d1[i];
writeln(ans);
close(input);
close(output);
end.
programdeliver;
q:
array[1..100000]oflongint;
procedurespfa;
//spfa是基于边的松弛操作的最短路径求法。
基本原理就是
i,j,k,now,min,t,w:
fillchar(q,sizeof(q),0);
t:
=1;
f[1]:
w:
q[t]:
repeat
=q[t];
now:
ifd[now]>
d[k]+e[j].vthen
d[now]:
=d[k]+e[j].v;
ifnotf[now]then
inc(w);
q[w]:
=now;
f[now]:
=false;
inc(t);
untilt>
w;
spfa;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 邻接 存储 方式