图的设计作业Word格式.docx
- 文档编号:22449435
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:8
- 大小:17.03KB
图的设计作业Word格式.docx
《图的设计作业Word格式.docx》由会员分享,可在线阅读,更多相关《图的设计作业Word格式.docx(8页珍藏版)》请在冰豆网上搜索。
用邻接矩阵存储网时只需要将矩阵中的1换为相应的权值,将0用一个不可能存在的权值代替即可。
当图用邻接矩阵表示后图的某些操作的实现是很方便的,如求某一顶点v
i的第一邻接点,只需在第i行找到第1个非零元即可。
若求某一顶点v
i的度,对于无向图来说,只须统计第i行的非零元个数或第i列的非零元个数(无向图的邻接矩阵是对称的);
当图中顶点数确定,插入一条边(v
i,v
j)只须将矩阵中第i行j列和第j行i列的元素分别改为1或相应的权值;
插入一条弧i,v
j>
只须将矩阵中第i行j列的元素改为1或相应的权值即可。
2邻接表:
一种链式存储结构
在邻接表中对图的每个顶点建立一个单链表,第i个单链表中包含第i个顶点的所有邻接点,每一个单链表包含两种结点,头结点和表结点。
在图的邻接表中,可以比较方便地查找一个顶点的边(出边)或邻接点(出边邻接点),这只要首先从表头向量中取出对应的表头指针,然后从表头指针出发进行查找即可。
邻接表则是以一数组(结构体数组)的元素作为头指针,后面链接和它相邻的结点.
3邻接矩阵表示法与邻接表表示法的比较:
1)邻接矩阵是唯一的,邻接表不唯一;
2)存储稀疏图用邻接表,存储稠密图用邻接矩阵;
3)求无向图顶点的度都容易,求有向图顶点的度邻接矩阵较方便;
4)判断是否是图中的边,邻接矩阵容易,邻接表最坏时间为O(n);
5)求边数e,邻接矩阵耗时为O(n^2),与e无关,邻接表的耗时
三.算法的设计思想
1邻接矩阵存储图的基本思路:
图用邻接矩阵表示后图的某些操作的实现是很方便的,如求某一顶点v
对于有向图来说,第i行的非零元个数为该顶点的出度,第i列的非零元个数为该顶点的入度,两者相加为该顶点的度。
2邻接表存储图的基本思路:
若无向图中有n个顶点e条边,则邻接表需要n个头结点和2e个表结点。
在边稀疏的情况下,采用邻接表比采用邻接矩阵节省存储空间。
在无向图的邻接表中,顶点v
i的度恰好为第i个链表中的表结点数。
若有向图中有n个顶点e条弧,则邻接表需要n个头结点和e个表结点。
在有向图的邻接表中,第i个链表中的结点数为顶点v
i的出度。
为求顶点v
i的入度,需要遍历整个邻接表,在所有链表中其邻接点域的值为i的结点个数为顶点v
i的入度。
在邻接表中,容易找到任意一顶点的第一邻接点和下一个邻接点,但要判断任意两个顶点v
i和v
j之间是否有边相连,则须搜索第i或j个链表,因此,不及邻接矩阵方便。
3深度优先遍历图的基本思路是:
(1)访问图中的指定起始点v
0;
(2)从v
0出发,访问一个与v
0邻接的顶点w
1后,再从w
1出发,访问与w
1邻接的且未访问的顶点w
2。
然后从w
2出发,重复上述过程,直到找不到未被访问的顶点为止。
(3)回退到尚有未被访问过的邻接点的顶点,从该顶点出发,重复上面的步骤,直到所有被访问过的顶点的邻接点都已访问为止。
4xx优先遍历是图的实现思路是:
0出发,依次访问v
0的未被访问的邻接点w
1,w
2,w
3,…,w
n。
然后依次访问w
n的未被访问的邻接点。
(3)重复上面的第二步,直到所有顶点的邻接点都已访问为止。
四.程序清单
#include<
stdio.h>
stdlib.h>
#defineNULL0
#definemaxsize10
typedefstructnode{intdata;
structnode*next;
}dnode;
typedefstruct
{intvex;
dnode*first;
}Node;
typedefstruct{Nodearry[maxsize];
intnum;
}graph;
intvisit[maxsize];
graphcreat()//创建邻接表{grapha;
dnode*p;
inti,x,y,e;
printf("
输入顶点数和边数(以空格分割):
"
);
scanf("
%d%d"
&
a.num,&
e);
for(i=1;
i<
=a.num;
i++){a.arry[i].first=NULL;
a.arry[i].vex=i;
}for(i=1;
=e;
i++){printf("
输入第%d个顶点的边:
i);
x,&
y);
p=(dnode*)malloc(sizeof(dnode));
p->
data=y;
next=a.arry[x].first;
a.arry[x].first=p;
data=x;
next=a.arry[y].first;
a.arry[y].first=p;
}returna;
}voidcopy(graphb,intv[][maxsize])//邻接矩阵与邻接表转换{inti,j;
=b.num;
i++)
for(j=1;
j<
j++)
v[i][j]=0;
i++){p=(dnode*)malloc(sizeof(dnode));
p=b.arry[i].first;
while(p){v[i][p->
data]=1;
p=p->
next;
}}
i++){for(j=1;
%d"
v[i][j]);
\n"
voidvexdu(grapha)//求度数{dnode*p;
inti,count;
i++){p=a.arry[i].first;
count=0;
while(p){count++;
}printf("
%d的度数:
%d\n"
a.arry[i].vex,count);
voidclr(){inti;
=maxsize;
visit[i]=0;
}voiddfs(grapha,intv){dnode*p;
if(a.arry[v].vex!
=0)
a.arry[v].vex);
visit[v]=1;
p=a.arry[v].first;
while(p){if(!
visit[p->
data])
dfs(a,p->
data);
next;
voidfind1(grapha){intv;
clr();
输入开始搜索节点:
v);
dfs(a,v);
}voidfind2(grapha){intx,i;
dnode*p,*q;
输入要查找删除的点:
x);
if(a.arry[i].vex==x)break;
if(i>
a.num){printf("
没找到!
return;
}"
else{printf("
找到!
q=p=a.arry[i].first;
a.arry[i].vex=0;
if(p->
data==x)p=p->
else
while(p){if(p->
data==x){q->
next=p->
break;
}q=p;
dfs(a,x);
}voidfind3(grapha){inti;
dfs(a,1);
a.num;
if(visit[i]==0){printf("
此图不是连通的。
return;
}voidfind4(grapha){intv[maxsize][maxsize];
copy(a,v);
}voidmain(){graphh;
h=creat();
vexdu(h);
find1(h);
find2(h);
find3(h);
find4(h);
}五.运行结果
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 设计 作业