图练习与答案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、应用题

1.首先将如下图所示的无向图给出其存储结构的邻接链表表示,然后写出对其分别进行深

度,广度优先遍历的结果。

1题图

答.深度优先遍历序列:4

宽度优先遍历序列:9

注:(1)邻接表不唯一,这里顶点的邻接点按升序排列

(2)在邻接表确定后,深度优先和宽度优先遍历序列唯一

(3)这里的遍历,均从顶点1开始

2.给出图G:

(1).画出G的邻接表表示图;

(2).根据你画出的邻接表,以顶点①为根,画出G的深度优先生成树和广度优先生成树。

(3)宽度优先生成树

3.在什么情况下,Prim算法与Kruskual算法生成不同的MST?

答.在有相同权值边时生成不同的MST,在这种情况下,用Prim或Kruskal也会生成不

同的MST

4.已知一个无向图如下图所示,要求分别用Prim 和Kruskal 算法生成最小树(假设以①为起点,试画出构造过程)。

答.Prim 算法构造最小生成树的步骤如24题所示,为节省篇幅,这里仅用Kruskal 算法,构造最小生成树过程如下:(下图也可选(2,4)代替(3,4),(5,6)代替(1,5))

5.G=(V,E)是一个带有权的连通图,则:

(1).请回答什么是G 的最小生成树; (2).G 为下图所示,请找出G 的所有最小生成树。

28题图

答.(1)最小生成树的定义见上面26题 (2)最小生成树有两棵。

(限于篇幅,下面的生成树只给出顶点集合和边集合,边以三元组(Vi,Vj,W )形式),其中W 代表权值。

V (G )={1,2,3,4,5} E1(G)={(4,5,2),(2,5,4),(2,3,5),(1,2,7)};

E2(G)={(4,5,2),(2,4,4),(2,3,5),(1,2,7)}

6.请看下边的无向加权图。 (1).写出它的邻接矩阵。(2).按Prim 算法求其最小生成树,并给出构造最小生成树过程中辅助数组的各分量值。辅助数组内各分量值:

7.已知世界六大城市为:北京(Pe)、纽约(N)、巴黎(Pa)、伦敦(L) 、东京(T) 、墨西哥(M),下表给定了这六大城市之间的交通里程:

世界六大城市交通里程表(单位:百公里)

(1).画出这六大城市的交通网络图;

(2).画出该图的邻接表表示法;

(3).画出该图按权值递增的顺序来构造的最小(代价)生成树.

8.已知顶点1-6和输入边与权值的序列(如右图所示):每行三个数表示一条边

的两个端点和其权值,共11行。请你:

(1).采用邻接多重表表示该无向网,用类PASCAL语言描述该数据结构,画出存

储结构示意图,要求符合在边结点链表头部插入的算法和输入序列的次序。

(2).分别写出从顶点1出发的深度优先和广度优先遍历顶点序列,以及相应的生成树。

(3).按prim算法列表计算,从顶点1始求最小生成树,并图示该树。

9.用最短路径算法,求如下图中a到z的最短通路。【

(4).由顶点V1到顶点V3的最短路径。【中山大学 1994 四(12分)】9.用最短路径算法,求如下图中a到z的最短通路。

10.已知图的邻接矩阵为:

当用邻接表作为图的存储结构,且邻接表都按序号从大到小排序时,试写出:

(1).以顶点V1为出发点的唯一的深度优先遍历;

(2).以顶点V1为出发点的唯一的广度优先遍历;

(3).该图唯一的拓扑有序序列。

11.已知一图如下图所示:

(1).写出该图的邻接矩阵;

(2).写出全部拓扑排序;

(3).以v1为源点,以v8为终点,给出所有事件允许发生的最早时间和最晚时间,并给出关键路径;

(4).求V1结点到各点的最短距离。

12.(1).对于有向无环图,叙述求拓扑有序序列的步骤;

(2).对于以下的图,写出它的四个不同的拓扑有序序列。

二.算法设计题

1.设无向图G有n个顶点,m条边。试编写用邻接表存储该图的算法。(设顶点值用1~n 或0~n-1编号)

答:

???? void CreatGraph (AdjList g)

ertex); g[i].firstarc=null;}

for (k=1;k<=m;k++)irstarc; g[i].firstarc=p;irstarc; g[j].frstarc=p;

}

}ertex); g[i].firstarc=null;}v2);

while(v1 && v2)irstarc; g[i].firstarc=p;

scanf(&v1,&v2);

} }

3.设有向G图有n个点(用1,2,…,n表示),e条边,写一算法根据其邻接表生成其反向邻接表,要求算法复杂性为O(n+e)。

答.

void InvertAdjList(AdjList gin,gout)

ertex=gout[i].vertex; =null; }

for (i=1;i<=n;i++) irstarc;irstarc; gin[j].firstarc=s;

p=p->next;irstarc; irstarc;}

6.试编写求无向图G的连通分量的算法。要求输出每一连通分量的顶点值。(设图G已用邻接表存储)

答.[题目分析] 使用图的遍历可以求出图的连通分量。进入dfs或bfs一次,就可以访问到图的一个连通分量的所有顶点。

void dfs ()

{visited[v]=1; printf ( “%3d”,v); irstarc;

while (p!=null)

{if(visited[p->adjvex==0]) dfs(p->adjvex);

p=p->next;

}ertex分量输出。

7.写出图的深度优先搜索DFS算法的非递归算法。

答.void Traver(AdjList g,vertype v)

irstarc; stack[++top]=p;

while(top>0 || p!=null)

{while (p)

if (p && visited[p->adjvex]) p=p->next;

else {printf(p->adjvex); visited[p->adjvex]=1;

stack[++top]=p; p=g[p->adjvex].firstarc;

}//else

if (top>0) {p=stack[top--]; p=p->next; }

}//while }//算法结束。

[算法讨论] 以上算法适合连通图,若是非连通图,则再增加一个主调算法,其核心语句是for (vi=1;vi<=n;vi++) if (!visited[vi]) Traver(g,vi);

8.已知个 n顶点的有向图,用邻接矩阵表示,编写函数计算每对顶点的最短路径。答.?? 本题用FLOYD算法直接求解如下:

void ShortPath_FLOYD(AdjMatrix g)

//求具有n个顶点的有向图每对顶点间的最短路径

{AdjMatrix length; //length[i][j]存放顶点vi到vj的最短路径长度。

for (i=1;i<=n;i++)

for (j=1;j<=n;j++) length[i][j]=g[i][j]; //初始化。

for (k=1;k<=n;k++)

for (i=1;i<=n;i++)

相关文档
最新文档